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

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

以下代碼在存放于github中如下倉庫: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))

    //通過得到文件句柄值,可以更好的控制文件的讀取。
    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))

    //沒有內(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 文件寫入實(shí)例

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

package main

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

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

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

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

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

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

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

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

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

    w.Flush()
}

Go 行過濾器實(shí)例

線過濾器是一種常見的程序,它讀取 stdin 上的輸入边败,處理它袱衷,然后將一些派生結(jié)果打印到 stdout 。 grep笑窜、sed是常見的線過濾器致燥。

package main

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

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

    for scanner.Scan(){
        // `Text` 返回當(dāng)前標(biāo)記嫌蚤,從輸入來說這里是下一行
        ucl := strings.ToUpper(scanner.Text())
        //寫出上面的行
        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ù)的訪問箱蝠。請(qǐng)注意,此切片中的第一個(gè)值是程序的路徑垦垂,os.Args[1:] 保存程序的參數(shù)宦搬。可以正常索引單個(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ù)的訪問
    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)系作者
  • 序言:七十年代末稳析,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弓叛,更是在濱河造成了極大的恐慌彰居,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撰筷,死亡現(xiàn)場(chǎng)離奇詭異陈惰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毕籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抬闯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來井辆,“玉大人,你說我怎么就攤上這事溶握”保” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵睡榆,是天一觀的道長(zhǎng)萍肆。 經(jīng)常有香客問我,道長(zhǎng)肉微,這世上最難降的妖魔是什么匾鸥? 我笑而不...
    開封第一講書人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮碉纳,結(jié)果婚禮上勿负,老公的妹妹穿的比我還像新娘。我一直安慰自己劳曹,他們只是感情好奴愉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铁孵,像睡著了一般锭硼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜕劝,一...
    開封第一講書人閱讀 49,874評(píng)論 1 290
  • 那天檀头,我揣著相機(jī)與錄音,去河邊找鬼岖沛。 笑死暑始,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婴削。 我是一名探鬼主播廊镜,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唉俗!你這毒婦竟也來了嗤朴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤虫溜,失蹤者是張志新(化名)和其女友劉穎雹姊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衡楞,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡容为,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坎背。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡替劈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出得滤,到底是詐尸還是另有隱情陨献,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布懂更,位于F島的核電站眨业,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沮协。R本人自食惡果不足惜龄捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慷暂。 院中可真熱鬧聘殖,春花似錦、人聲如沸行瑞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血久。三九已至突照,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氧吐,已是汗流浹背讹蘑。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筑舅,地道東北人座慰。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豁翎,于是被迫代替她去往敵國和親角骤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隅忿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

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