本節(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.go 將 go 和 hello.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(嵌入式)