Go語言中的IO操作及Flag包的用法
一、格式化輸入和輸出
1.從終端獲取用戶的輸入
fmt.Scanf 空格作為分隔符,占位符和格式化輸出的一致
fmt.Scan 從終端獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格和換行符作為分隔符
fmt.Scanln 從終端獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格作為分隔符,換行符作為結(jié)束
Scanf 例子:
package main
import (
"fmt"
)
func TestScanf(){
var a int
var b string
var c float32
fmt.Scanf("%d%s%f",&a,&b,&c)
fmt.Printf("a=%d b=%s c=%f",a,b,c)
}
func main(){
TestScanf()
}結(jié)果:
> 111 abvc 111
a=111 b=abvc c=111.000000
這里我們是通過一行輸入的,并且是以空格作為分割的,但是如果想通過多行輸入,那么在Windows下Scanf可能會存在一個問題,如下:
func TestScanf(){
var a int
var b string
var c float32
fmt.Scanf("%d",&a)
fmt.Scanf("%s",&b)
fmt.Scanf("%f",&c)
fmt.Printf("a=%d b=%s c=%f",a,b,c)
}然后我們在windows下面去運(yùn)行一下

由上面的我們可以看到,只接受到了第一個值,第二值輸入之后回車,發(fā)現(xiàn)b和c都沒有值。主要是由于Windows下面,回車會 自動加上 \r\n。
如果想要正確的獲取這個值,可以修改如下:在每一個scanf上面都加上“\n”
func TestScanf(){
var a int
var b string
var c float32
fmt.Scanf("%d\n",&a)
fmt.Scanf("%s\n",&b)
fmt.Scanf("%f\n",&c)
fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}Scan例子:
func TestScan(){
var a int
var b string
var c float32
fmt.Scan(&a,&b,&c)
fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}Scanln例子:
func TestScanln(){
var a int
var b string
var c float32
fmt.Scanln(&a)
fmt.Scanln(&b)
fmt.Scanln(&c)
fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}2.從字符串中獲取
上面是從終端輸入的字符串中提取數(shù)據(jù),然后還可以從一個已經(jīng)存在的字符串中提取。
fmt.Sscanf 空格作為分隔符,占位符和格式化輸出的一致
fmt.Sscan 從字符串獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格和換行符作為分隔符
fmt.Sscanln 從字符串獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格作為分隔符,換行符作為結(jié)束
下面的例子就是從str中提取整數(shù)、字符串和浮點數(shù)
func TestSscanf(){
var a int
var b string
var c float32
str := "123 hello 111.1"
fmt.Sscanf(str,"%d%s%f",&a,&b,&c)
fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}備注:一定要傳地址進(jìn)去,否則修改是變量的副本,也就是說讀取不到用戶的輸入了。
3.從文件中獲取
fmt.Fscanf 空格作為分隔符,占位符和格式化輸出的一致
fmt.Fscan 從文件獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格和換行符作為分隔符
fmt.Fscanln 從文件獲取用戶的輸入,存儲在Scanln中的參數(shù)里,空格作為分隔符,換行符作為結(jié)束
4.終端輸入輸出的原理
終端相當(dāng)于是一個文件, 所以可以用 os.stdin 和os.stdout 作為輸入和輸出。查看源碼可以看到他們其實就是*File
二、bufio包的使用
為了完善文件本身讀取性能差的問題,增加了緩沖區(qū)操作。
package main
import (
"bufio"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
buf, _ := reader.ReadBytes('\n')
println((string)(buf))
}備注:這里可以看到NewReader的參數(shù)是一個io.Reader接口 , os.Stdin則是返回一個*File ,由于File實現(xiàn)了io.Reader的Read方法,所以可以接受File作為參數(shù)(鴨子類型)。
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
golang的database.sql包和事務(wù)處理操作步驟
事務(wù)是數(shù)據(jù)庫操作中的一個邏輯單元,由一系列的數(shù)據(jù)庫操作組成,這一系列操作要么全部執(zhí)行并且提交,要么全部回滾,確保數(shù)據(jù)的一致性和完整性,這篇文章主要介紹了golang的database.sql包和事務(wù)處理操作步驟,需要的朋友可以參考下2025-04-04
解決golang 反射interface{}做零值判斷的一個重大坑
這篇文章主要介紹了解決golang 反射interface{}做零值判斷的一個重大坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
細(xì)細(xì)探究Go 泛型generic設(shè)計
這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Go語言中?Print?Printf和Println?的區(qū)別解析
這篇文章主要介紹了Go語言中?Print?Printf和Println?的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

