怎么应用Golang的标准库fmt
fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。
1.1向外输出1.1.1Print
Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。func Print(a ...interface{}) (n int, err error)func Printf(format string, a ...interface{}) (n int, err error)func Println(a ...interface{}) (n int, err error)
package mainimport "fmt"func main() { fmt.Print("Print输出信息!") name := "vita" fmt.Printf("Printf输出name:%s\n",name) fmt.Println("Println输出信息")}结果:Print输出信息!Printf输出name:vitaPrintln输出信息Process finished with exit code 0
1.1.2Fprint
Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容。func Fprint(w io.Writer, a ...interface{}) (n int, err error)func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
package mainimport ( "fmt" "os")func main() { //写入到标准输出 fmt.Fprint(os.Stdout,"Fprint向标准输出写入内容") fmt.Fprintln(os.Stdout,"Fprintln向标准输出写入内容") name := "vita" fmt.Fprintf(os.Stdout,"Fprintf向标准输出写入内容name:%s",name) fileObj,err := os.OpenFile("./file",os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil{ fmt.Println("打开文件出错,err:",err) } //写入到文件中 fmt.Fprint(fileObj,"Fprint向文件中写入内容") fmt.Fprintln(fileObj,"Fprintln向文件中写入内容") fmt.Fprintf(fileObj,"Fprintf向文件中写入内容,name:%s",name)}结果:Fprint向标准输出写入内容Fprintln向标准输出写入内容Fprintf向标准输出写入内容name:vitaProcess finished with exit code 0
Sprint系列函数会把传入的数据生成并返回一个字符串。func Sprint(a ...interface{}) stringfunc Sprintf(format string, a ...interface{}) stringfunc Sprintln(a ...interface{}) string
package mainimport "fmt"func main() { s1 := fmt.Sprint("Sprint") fmt.Println(s1) s2 := fmt.Sprintln("Sprintln") fmt.Println(s2) s3 := fmt.Sprintf("Sprintf,s1:%s",s1) fmt.Println(s3)}结果:SprintSprintlnSprintf,s1:SprintProcess finished with exit code 0
1.1.4Errorf
Errorf函数根据format参数生成格式化字符串并返回一个包含改字符串的错误。func Errorf(format string, a ...interface{}) error通常使用该方法定义错误类型。
package mainimport "fmt"func main() { name := "vita" err := fmt.Errorf("%s创建了一个错误",name) fmt.Printf("value:%v type:%T",err,err)}结果:value:vita创建了一个错误 type:*errors.errorStringProcess finished with exit code 0
1.1.5格式化占位符
*printf系列函数都支持format格式化参数,在这个我们按照占位符将被替换的变量类型划分,方便查询和记忆。
1.1.5.1通用占位符
package mainimport "fmt"func main() { fmt.Printf("v:%v\n", 100) fmt.Printf("v:%v\n", false) o := struct{ name string }{"小王子"} fmt.Printf("v:%v\n", o) fmt.Printf("+v:%+v\n", o) fmt.Printf("#v:%#v\n", o) fmt.Printf("T:%T\n", o) fmt.Printf("100%%\n")}结果:v:100v:falsev:{小王子}+v:{name:小王子}#v:struct { name string }{name:"小王子"}T:struct { name string }100%Process finished with exit code 0
1.1.5.2布尔型
package mainimport "fmt"func main() { fmt.Printf("t:%t\n", false) fmt.Printf("v:%v\n", false)}结果:t:falsev:falseProcess finished with exit code 0
1.1.5.3整型
package mainimport "fmt"func main() { n := 65 fmt.Printf("%b\n", n) fmt.Printf("%c\n", n) fmt.Printf("%d\n", n) fmt.Printf("%o\n", n) fmt.Printf("%x\n", n) fmt.Printf("%X\n", n)}结果:1000001A651014141Process finished with exit code 0
1.1.5.4浮点数与复数
package mainimport "fmt"func main() { f := 12.34 fmt.Printf("b:%b\n", f) fmt.Printf("e:%e\n", f) fmt.Printf("E:%E\n", f) fmt.Printf("f:%f\n", f) fmt.Printf("F:%F\n", f) fmt.Printf("g:%g\n", f) fmt.Printf("G:%G\n", f)}结果:b:6946802425218990p-49e:1.234000e+01E:1.234000E+01f:12.340000F:12.340000g:12.34G:12.34Process finished with exit code 0
1.1.5.5字符串和[]byte
package mainimport "fmt"func main() { s := "小王子" fmt.Printf("%s\n", s) fmt.Printf("%q\n", s) fmt.Printf("%x\n", s) fmt.Printf("%X\n", s)}结果:小王子"小王子"e5b08fe78e8be5ad90E5B08FE78E8BE5AD90Process finished with exit code 0
1.1.5.6指针
package mainimport "fmt"func main() { a := 10 fmt.Printf("%p\n", &a) fmt.Printf("%#p\n", &a)}结果:0xc00007e000c00007e000Process finished with exit code 0
1.1.5.7宽度标识符
宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。举例如下
package mainimport "fmt"func main() { n := 12.34 fmt.Printf("%f\n", n) fmt.Printf("%9f\n", n) fmt.Printf("%.2f\n", n) fmt.Printf("%9.2f\n", n) fmt.Printf("%9.f\n", n)}结果:12.34000012.34000012.34 12.34 12Process finished with exit code 0
1.1.5.8其他flag
package mainimport "fmt"func main() { s := "小王子" fmt.Printf("%s\n", s) fmt.Printf("%5s\n", s) fmt.Printf("%-5s\n", s) fmt.Printf("%5.7s\n", s) fmt.Printf("%-5.7s\n", s) fmt.Printf("%5.2s\n", s) fmt.Printf("%05s\n", s)}结果:小王子 小王子小王子 小王子小王子 小王00小王子Process finished with exit code 0
1.2获取输入1.2.1fmt.Scan
func Scan(a ...interface{}) (n int, err error)Scan从标准输入扫描文本,读取由"空白符"分隔的值保存到传递给本函数的参数中,换行符视为空白符。本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
package mainimport "fmt"func main() { var ( name string age int married bool ) fmt.Scan(&name,&age,&married) fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)}在终端输入name,age,married对应的值lili 23 true扫描结果 name:lili age:23 married:true Process finished with exit code 0
1.2.2fmt.Scanf
func Scanf(format string, a ...interface{}) (n int, err error)Scanf 从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到本函数的参数中。本函数返回成功扫描的数据个数和遇到的任何错误。注意:Scanf不同于Scan,Scanf为输入数据制定了具体的输入内容格式,只有按照格式输入数据,才会扫描成功并存入变量中。
package mainimport "fmt"func main() { var ( name string age int married bool ) fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married) fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)}结果:1:lili 2:27 3:true扫描结果 name: age:0 married:false Process finished with exit code 0
1.2.3fmt.Scanln
func Scanln(a ...interface{}) (n int, err error)Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。本函数返回成功扫描的数据个数和遇到的任何错误。
package mainimport "fmt"func main() { var ( name string age int married bool ) fmt.Scanln( &name, &age, &married) fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)}结果:lili 27 true扫描结果 name:lili age:27 married:true Process finished with exit code 0
1.2.4bufio.NewReader
有时候,我们想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。
package mainimport ( "bufio" "fmt" "os" "strings")func main() { reader := bufio.NewReader(os.Stdin) //从标准输入生成读对象 fmt.Print("请输入内容:") text,_ := reader.ReadString('\n') //读到换行 text = strings.TrimSpace(text) fmt.Printf("%#v\n",text)}结果:请输入内容:ww qq aa"ww qq aa"Process finished with exit code 0
1.2.5Fscan系列
这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据。func Fscan(r io.Reader, a ...interface{}) (n int, err error)func Fscanln(r io.Reader, a ...interface{}) (n int, err error)func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
package mainimport ( "fmt" "os")func main() { var ( name string age int ) fileObj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_RDONLY|os.O_APPEND, 0644) if err != nil { fmt.Println("打开文件出错,err:", err) return } fmt.Fscan(fileObj,&name,&age) fmt.Println(name,age)}结果:lili 27Process finished with exit code 0
这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从指定字符串中读取数据。func Sscan(str string, a ...interface{}) (n int, err error)func Sscanln(str string, a ...interface{}) (n int, err error)func Sscanf(str string, format string, a ...interface{}) (n int, err error)
package mainimport "fmt"func main() { var ( name string age int ) fmt.Sscan("lili 27",&name,&age) fmt.Println(name,age)}结果:lili 27Process finished with exit code 0
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。