Go 語(yǔ)言編程實(shí)例(八)

本節(jié)主要分享:文件讀取、文件寫(xiě)入、線過(guò)濾器、命令行參數(shù)、命令行標(biāo)識(shí)

以下代碼在存放于github中如下倉(cāng)庫(kù):github

Go 文件讀取

程序的基本功能之一就是文件的操作,這里提供一個(gè)思路是Go 讀取文件,文件讀取時(shí)候需要進(jìn)行錯(cuò)誤判斷。

package main

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

// 讀取文件需要檢查大多數(shù)的調(diào)用錯(cuò)誤
// 這個(gè)函數(shù)幫助簡(jiǎn)化錯(cuò)誤檢查

func check(e error){
    if e != nil {
        panic(e)
    }
}


func main(){
    //最基本的文件讀取到內(nèi)存中
    dat , err := ioutil.ReadFile("test.log")
    check(err)
    fmt.Print(string(dat))

    //通過(guò)得到文件句柄值,可以更好的控制文件的讀取。
    f,err := os.Open("test.log")
    check(err)

    //讀取到一個(gè)5字節(jié)的數(shù)組中
    b1 := make([]byte,5)
    n1,err:=f.Read(b1)
    check(err)
    fmt.Printf("%d bytes: %s\n",n1,string(b1))

    //找到一個(gè)已知位置然后讀取
    o2 , err := f.Seek(5,0)
    check(err)
    b2 := make([]byte,2)
    n2,err := f.Read(b2)
    check(err)
    fmt.Printf("%d bytes @ %d: %s\n",n2,o2,string(b2))

    //沒(méi)有內(nèi)置的倒帶,但是 Seek(0,0) 可以實(shí)現(xiàn)這一點(diǎn)
    _,err = f.Seek(0,0)
    check(err)

    //bufio 包提供了一個(gè)緩沖的讀取器,因?yàn)樗哂性S多小文件讀取的效率,并且提供了額外的讀取方式
    //適當(dāng)使用可以提到程序性能。
    r4 := bufio.NewReader(f)
    b4,err := r4.Peek(5)
    check(err)
    fmt.Printf("5 bytes: %s\n",string(b4))

    //關(guān)閉文件
    f.Close()
}

Go 文件寫(xiě)入實(shí)例

在Go中文件的讀取和寫(xiě)入模式類似。寫(xiě)入文件同樣需要檢查大多數(shù)的調(diào)用錯(cuò)誤。

package main

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

func check(e error){
    if e != nil {
        panic(e)
    }
}

func main(){
    //寫(xiě)入一個(gè)字符串到文件中
    d1 := []byte("hello \n go \n")
    err := ioutil.WriteFile("write_test.txt",d1,0644)
    check(err)

    //打開(kāi)文件并寫(xiě)入數(shù)據(jù)(更為精細(xì)的調(diào)用)
    f ,err := os.Create("write_test2.txt")
    check(err)

    //打開(kāi)文件后一般操作就是立即推遲關(guān)閉文件
    defer f.Close()

    //按照預(yù)期的方式寫(xiě)入字節(jié)片段
    d2 := []byte{115,111,109,101,10}
    n2,err := f.Write(d2)
    check(err)
    fmt.Printf("Write %d bytes \n",n2)

    //寫(xiě)入字符串
    n3 , err := f.WriteString("writes \n")
    fmt.Printf("write %d bytes \n",n3)

    //刷新緩沖,保證數(shù)據(jù)寫(xiě)到硬盤中去了
    f.Sync()

    //bufio 提高文件讀寫(xiě)性能
    w := bufio.NewWriter(f)
    n4,err:=w.WriteString("buffered\n")
    fmt.Printf("write %d bytes\n",n4)

    w.Flush()
}

Go 行過(guò)濾器實(shí)例

線過(guò)濾器是一種常見(jiàn)的程序,它讀取 stdin 上的輸入,處理它,然后將一些派生結(jié)果打印到 stdout 。 grepsed是常見(jiàn)的線過(guò)濾器。

package main

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

func main(){
    //用緩沖掃描包裝無(wú)緩沖的 os.Stdin 可以讓我們方便的掃描方法使掃描儀進(jìn)入下一標(biāo)記,
    //這是默認(rèn)掃描器中的下一行。
    scanner := bufio.NewScanner(os.Stdin)

    for scanner.Scan(){
        // `Text` 返回當(dāng)前標(biāo)記,從輸入來(lái)說(shuō)這里是下一行
        ucl := strings.ToUpper(scanner.Text())
        //寫(xiě)出上面的行
        fmt.Println(ucl)
    }

    //檢查掃描期間的錯(cuò)誤。文件結(jié)束是預(yù)期的,不會(huì)被 scan 報(bào)告為錯(cuò)誤。
    if err := scanner.Err(); err != nil {
        fmt.Println(os.Stderr,"error:",err)
        os.Exit(1)
    }
}

Go 命令行參數(shù)實(shí)例

命令行參數(shù)是參數(shù)化程序執(zhí)行的常用方法。例如 : go run hello.gogohello.go 作為參數(shù)應(yīng)用到 go 程序中。

os.Args 提供對(duì)原始命令行參數(shù)的訪問(wèn)。請(qǐng)注意,此切片中的第一個(gè)值是程序的路徑,os.Args[1:] 保存程序的參數(shù)??梢哉K饕龁蝹€(gè) arg 值。

注意:運(yùn)行一下程序建議在 cmd 中進(jìn)行:

go run cmd_args.go 1 2 3 4 5
package main

import (
    "os"
    "fmt"
)

func main(){
    //os.Args 提供了原始命令行參數(shù)的訪問(wèn)
    argsWithProg := os.Args
    argsWithoutProg := os.Args[1:]

    //可以單獨(dú)提取參數(shù)
    arg := os.Args[3]

    fmt.Println(argsWithoutProg)
    fmt.Println(argsWithProg)
    fmt.Println(arg)
}

Go 命令行標(biāo)識(shí)實(shí)例

命令行標(biāo)識(shí)是制定命令行程序選項(xiàng)的常用方法。例如,在 go build -ldflags abc ac.go ,其中 -ldflags 是命令行標(biāo)識(shí)。Go 提供了一個(gè)支持基本命令行標(biāo)識(shí)解析的標(biāo)識(shí)標(biāo)志包。如下示例:

import (
    "flag"
    "fmt"
)

func main(){
    //基本標(biāo)志聲明可用于字符串,整數(shù)和布爾選項(xiàng)。這里我們聲明一個(gè)帶有默認(rèn)值
    //foo 的字符串標(biāo)識(shí) word 和一個(gè)簡(jiǎn)短的描述。這個(gè) flag.String 函數(shù)一個(gè)字符串指針
    wordPtr := flag.String("word","foo","a string")

    //聲明 numb 和 fork標(biāo)識(shí),使用和word標(biāo)識(shí)相同的方法
    numbPtr := flag.Int("numb",42,"an int")
    boolPtr := flag.Bool("fork",false,"a bool")

    //還可以聲明一個(gè)使用在程序中其他地方聲明的現(xiàn)有變量的選項(xiàng)。
    //我們需要傳遞一個(gè)指向標(biāo)識(shí)聲明的函數(shù)指針
    var svar string
    flag.StringVar(&svar,"svar","bar","a string var")

    //一旦所有的標(biāo)識(shí)都聲明好了,就可以解析了
    flag.Parse()


    //顯示消息
    fmt.Println("word:",*wordPtr)
    fmt.Println("numb:",*numbPtr)
    fmt.Println("fork",*boolPtr)
    fmt.Println("svar:",svar)
    fmt.Println("tail",flag.Args())
}

操作輸出如下:

C:\Go\MyGo\src\lesson8_file>go build cmd_flags.go

C:\Go\MyGo\src\lesson8_file>cmd_flags.exe -word=ckl -numb=05202235 -fork -svar=flag
word: ckl
numb: 1377437
fork true
svar: flag
tail []

如需進(jìn)一步討論可以加群:295023494(嵌入式)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • linux資料總章2.1 1.0寫(xiě)的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,236評(píng)論 2 33
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,329評(píng)論 0 17
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • 她是 生性無(wú)知的貓咪 她有 知己好友 三兩只 她說(shuō) 人生百態(tài) 恕不知 她說(shuō) 交往處事 自不知 她說(shuō) 開(kāi)懷大笑 因陽(yáng)...
    文君女神閱讀 158評(píng)論 0 0

友情鏈接更多精彩內(nèi)容