golang之終端操作,文件操作


終端操作

操作終端相關的文件句柄常量
os.Stdin:標准輸入
os.Stdout:標准輸出
os.Stderr:標准錯誤輸出

關於終端操作的代碼例子:

package main

import "fmt"

func main() {
    var (
        firstName, lastName, s string
        i                      int
        f                      float32
        input                  = "52.22/2334/go"
        format                 = "%f/%d/%s"
    )
    fmt.Println("Please input your name")
    //fmt.Scanf("%s %s", &firstName, &lastName)
    fmt.Scanln(&firstName, &lastName) //和上一句的效果相同

    fmt.Printf("Hi %s %s\n", firstName, lastName)
    fmt.Sscanf(input, format, &f, &i, &s)
    fmt.Println("From the string we read are\n", f, i, s)
}

 

關於帶緩沖區的讀寫

這里需要用到一個包:bufio

下面是代碼例子:

package main

import (
    "bufio"
    "fmt"
    "os"
)

var inputReader *bufio.Reader
var input string
var err error

func main() {
    inputReader = bufio.NewReader(os.Stdin)
    fmt.Println("Please input some words")
    //// 下面這個表示我們讀取一行,最后是以\n 為分割的,\n表示換行
    input, err = inputReader.ReadString('\n')
    if err != nil {
        fmt.Printf("error:", err)
        return
    }
    fmt.Printf("the input was:%s\n", input)
}

練習終端操作

從終端讀取一行字符串,統計英文,數字,空格以及其他字符的數量
代碼實現:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func judge(str string) {
    var countNum, countLetter, countSpace, countOther int
    for _, v := range str {
        if v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' {
            countLetter++
        } else if v >= '0' && v <= '9' {
            countNum++
        } else if v == ' ' {
            countSpace++
        } else {
            countOther++
        }
    }
    fmt.Printf("字母的數量是:%d\n", countLetter)
    fmt.Printf("數字的數量是:%d\n", countNum)
    fmt.Printf("空格的數量是:%d\n", countSpace)
    //之所以-1,是因為多算了一個換行符\n
    fmt.Printf("其他字符的數量是:%d\n", countOther-1)
}
func main() {
    var inputReader *bufio.Reader
    inputReader = bufio.NewReader(os.Stdin)
    str, err := inputReader.ReadString('\n')
    if err != nil {
        fmt.Println(err)
        return
    }
    judge(str)
}

關於文件讀寫

os.File封裝所有文件相關的操作

打開一個文件進行讀操作:os.Open(name string)(*File,error)
關閉一個文件:File.Close()

關於文件操作的一個簡單例子:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    //注意這里文件地址需要用雙引號
    file, err := os.Open("/Users/myname/learngo/src/go_dev/day06/bufio/bufio.go")
    if err != nil {
        fmt.Println("open file err:", err)
        return
    }
    //注意這里defer關閉文件
    defer file.Close()
    inputReader := bufio.NewReader(file)
    i := 0
    for {
        inputString, readErr := inputReader.ReadString('\n')
        if readErr == io.EOF { //表示讀取到文件末尾
            return
        }
        i++ //行數
        //打印每行的行號和內容
        fmt.Printf("%d %s\n", i, inputString)
    }
}

上面例子中關於讀文件是一行一行的讀的,下面我們也可以一次性讀完整的文件,但是切記如果文件過大,這種方法不適用,這里用到是io/ioutil包

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    buff, err := ioutil.ReadFile("/Users/myname/learngo/src/go_dev/day06/bufio/bufio.go")
    if err != nil {
        fmt.Println("read file error:", err)
        return
    }
    fmt.Printf("the content of file is:%s\n", string(buff))
}

關於讀取壓縮文件的例子,這里用到的是compress/gzip包

package main

import (
    "bufio"
    "compress/gzip"
    "fmt"
    "io"
    "os"
)

func main() {
    //注意這里的壓縮文件需要使gzip -k xxx,-k意思是保留源文件
    file, err := os.Open("/Users/myname/learngo/src/go_dev/day06/gzip/bufio.go.gz")
    if err != nil {
        fmt.Println("open file err:", err)
        return
    }
    defer file.Close()

    reader, err := gzip.NewReader(file)
    if err != nil {
        fmt.Println("gzip file err:", err) //如果不是.gz文件,則gzip: invalid header
        return
    }
    bfreader := bufio.NewReader(reader)

    for {
        line, err := bfreader.ReadString('\n')
        if err != nil {
            if err == io.EOF {
                break
            }
            fmt.Println("read file err:", err)
            break
        }
        fmt.Printf("%s\n", line)
    }
}

關於文件的寫入

os.OpenFile("filename",os.O_WRONLY|os.O_CREATE,066)

第一個參數是文件名
第二個參數是文件的打開模式:
os.O_WRONLY:只寫
os.O_CREATE:創建文件
os.O_RDONLY:只讀
os.O_RDWR:讀寫
os.O_TRUNC:清空

第三個參數:權限控制
r-->4
w-->2
x-->1
這里和linux的是一樣的

關於寫入文件的一個例子,這里寫了兩種方法一種是直接writestring方法,一種是通過bufio的方式:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

func testWriteFile() {
    file, err := os.OpenFile("testWriteFile.txt", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        fmt.Println("open file error:", err)
        return
    }
    defer file.Close()
    for i := 0; i < 10; i++ {
        file.WriteString("hello " + strconv.Itoa(i) + "\n")
    }
}

func testWriteBufio() {
    file, err := os.OpenFile("testWriteBufio.txt", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        fmt.Println("open file error;", err)
        return
    }
    defer file.Close()

    bufioWriter := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        bufioWriter.WriteString(strconv.Itoa(i) + "hello\n")
    }
    bufioWriter.Flush()

}

func main() {
    testWriteFile()
    testWriteBufio()
}

關於拷貝文件的例子:

package main

import (
    "fmt"
    "io"
    "os"
)

func copyFile() (writen int64, err error) { //注意這里返回的參數
    src, err := os.Open("testWriteFile.txt")
    if err != nil {
        fmt.Println("open src file error: ", err)
        return
    }
    defer src.Close()

    dst, err := os.OpenFile("dst.txt", os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        fmt.Println("openfile dst error: ", err)
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}
func main() {
    copyFile()
}

關於獲取命令行參數

os.Args是一個string的切片,用來存儲所有命令行的參數
但是通過這種方式獲取參數有點笨拙,並且需要做很多的判斷,我們可以通過go里面的flag包來做,代碼例子如下:

package main

import (
    "flag"
    "fmt"
)

var (
    conf  string
    level int
)

func init() {
    flag.StringVar(&conf, "c", "/Users/myname/", "請指定配置文件路徑")
    flag.IntVar(&level, "l", 8, "請指定日志級別")
    flag.Parse() //這個非常重要,不能忘記
}

func main() {
    fmt.Printf("conf is %s\n", conf)
    fmt.Printf("level is %d\n", level)
    //運行go run args/args.go
    //go run args/args.go -c '/Users/myname/learngo' -l 7
    /*
            -c string
                請指定配置文件路徑 (default "/Users/myname/")
          -l int
                請指定日志級別 (default 8)
    */
}

上面的例子設置了默認參數,如果我們想自定義參數在運行的時候添加 -c=內容 -l=內容 ,就可以用我們通過命令行參數傳入的值進行處理

轉自https://www.cnblogs.com/zhaof/p/8285339.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM