終端操作
操作終端相關的文件句柄常量
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