1. 程式人生 > >golang之終端操作,檔案操作

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