标准库之 fmt

1|0fmt库

  • fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为输出和获取输入两大部分

  • 和python的直接使用f-string不同的是,Go中的格式化输入和格式化输出,都需要先导fmt包后才能使用

1|11. 获取输入

  • 作用就是python中的input

  • Go语言fmt包下有fmt.Scanfmt.Scanffmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入

1|0(1)fmt.Scan(常用)

Scan的函数定义: func Scan(a ...interface{}) (n int, err error) ********Scan的返回值一般没啥用,通常不接收。注意:参数为变量地址******** Scan函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因 ********Scan 函数用 空格 和 回车 当作每个输入参数之间的间隔符 ,当回车时,若输入参数的个数不够,仍可以继续输入******** package main import "fmt" func main() { var ( name string age int married bool ) fmt.Print("请输入:") cnt, res := fmt.Scan(&name, &age, &married) // 直接写成 fmt.Scan(&name, &age, &married) 就行,一般不用接收返回值 fmt.Println("cnt,res", cnt, res) fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married) }

1|0(2)fmt.Scanln(常用)

同上面的fmt.Scan用法一致,只有一点不同,就是fmt.Scanln方法,在输入参数时,只能以空格作为不同参数之间的间隔符,回车会直接结束输入 Scanln的函数定义: func Scanln(a ...interface{}) (n int, err error)

1|0(3)fmt.Scanf

  • 格式化输入,必须与定义的输入内容格式一致,才能被接收
  • 在输入参数时,只能以空格作为不同参数之间的间隔符,回车会直接结束输入
package main import "fmt" func main() { var ( name string age int married bool ) fmt.Print("请输入:") fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married) fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married) } /* 示例输入: 1:小王子 2:28 3:false 必须按照:1:参数1 2:参数2 3:参数3 来进行输入,且参数类型不能错误,可以漏输右边的部分,不能漏输左边的部分 1:参数1 // 参数1可以被接收到 1:参数1 2:参数2 // 参数1 参数2可以被接收到 2:参数2 // 参数2 不能被接收 */

1|22. print、println、printf 输出

  • fmt.print、fmt.println、fmt.printf 三种
    • print就是普通的输出
    • println 会在输出内容的结尾添加一个换行符,即可以自动换行
    • printf 为格式化输出字符串,能识别各种占位符
函数定义: func Print(a ...interface{}) (n int, err error) func Println(a ...interface{}) (n int, err error) func Printf(format string, a ...interface{}) (n int, err error) 简单示例: package main import "fmt" func main() { fmt.Print("在终端打印该信息。") name := "沙河小王子" fmt.Printf("我是:%s\n", name) fmt.Println("在终端打印单独一行显示") } /* 在终端打印该信息。我是:沙河小王子 在终端打印单独一行显示 */

1|33. Sprint(了解即可)

  • Sprint系列函数会把传入的数据生成并返回一个字符串
函数定义: func Sprint(a ...interface{}) string func Sprintf(format string, a ...interface{}) string func Sprintln(a ...interface{}) string 简单示例:
package main import "fmt" func main() { s1 := fmt.Sprint("沙河小王子") name := "沙河小王子" age := 18 s2 := fmt.Sprintf("name:%s,age:%d", name, age) s3 := fmt.Sprintln("沙河小王子") // s3末尾因为Sprintln函数而多了一个换行符 fmt.Println("1111") fmt.Print(s1, s2, s3) // 这里我们没有换行,而下面的打印结果显示,换行打印了2222 fmt.Println("2222") } /* 1111 沙河小王子name:沙河小王子,age:18沙河小王子 2222 */

1|44. Errorf(了解即可)

  • Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误
函数定义: func Errorf(format string, a ...interface{}) error 通常使用这种方式来自定义错误类型,例如: err := fmt.Errorf("这是一个错误")

1|55. 格式化占位符

  • 掌握常用的几个即可 %% %d %s %p %T %.nf (n为保留的小数个数),其他当作了解

1|0(1)通用占位符

占位符 说明
%v 值的默认格式表示,将值格式化为一个更紧凑的表示形式
%+v 类似%v,但输出结构体时会添加字段名
%#v 值的Go语法表示
%T 打印值的类型
%% 百分号

1|0(2)布尔型占位符

占位符 说明
%t true或false

1|0(3)整型占位符

占位符 说明
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于”U+%04X”
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
  • 示例
package main import "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) } /* 1000001 A 65 101 41 41 */

1|0(4)浮点数与复数占位符

占位符 说明
%b 无小数部分、二进制指数的科学计数法,如-123456p-78
%e 科学计数法,如-1234.456e+78
%E 科学计数法,如-1234.456E+78
%f 有小数部分但无指数部分,如123.456
%F 等价于%f
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
  • 示例
package main import "fmt" func main() { f := 12.34 fmt.Printf("%b\n", f) fmt.Printf("%e\n", f) fmt.Printf("%E\n", f) fmt.Printf("%f\n", f) fmt.Printf("%g\n", f) fmt.Printf("%G\n", f) } /* 6946802425218990p-49 1.234000e+01 1.234000E+01 12.340000 12.34 12.34 */

1|0(5)字符串和[]byte占位符

占位符 说明
%s 直接输出字符串或者[]byte
%q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示(使用a-f)
%X 每个字节用两字符十六进制数表示(使用A-F)
  • 示例
package main import "fmt" func main() { s := "王子" fmt.Printf("%s\n", s) fmt.Printf("%q\n", s) fmt.Printf("%x\n", s) fmt.Printf("%X\n", s) } /* 王子 "王子" e78e8be5ad90 E78E8BE5AD90 */

1|0(6)指针占位符

占位符 说明
%p 表示为十六进制,并加上前导的0x
%#p 表示为十六进制,不加上前导的0x
  • 示例
package main import "fmt" func main() { a := 10 fmt.Printf("%p\n", &a) fmt.Printf("%#p\n", &a) } // 0xc00000a0d8 // c00000a0d8

1|0(7)宽度标识符

  • 宽度通过一个紧跟在百分号后面的十进制数指定,如果未指定宽度,则表示值时除必需之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号后没有跟数字,表示精度为0。举例如下
  • 宽度可以理解为整型部分的长度,精度可以理解为小数的长度
占位符 说明
%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度,精度2
%9.2f 宽度9,精度2
%9.f 宽度9,精度0
  • 示例
package main import "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.340000 12.340000 12.34 12.34 12 */

1|0(8)其他

占位符 说明
’+’ 总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义)
’ ‘ 对数值,正数前加空格而负数前加负号;对字符串采用%x或%X时(% x或% X)会给各打印的字节之间加空格
’-’ 在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐)
’#’ 八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p)对%q(%#q),对%U(%#U)会输出空格和单引号括起来的go字面值
‘0’ 使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面
  • 示例
package main import "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) } /* 王子 王子 王子 王子 王子 王子 000王子 */

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/18055978.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示