1、内置函数print() vs 标准输出流fmt.Print()

  • 建议用fmt.Print格式输出;官方不建议用print,后期不保证是否会继续保留。
  • print和println输出到标准错误流中并打印,可以在debug时候用。
  • fmt.Print是对print的封装,"fmt.Print"默认是"%v"格式的print。
  • print默认打印的是slice[0]的地址;fmt.Println默认打印的slice是数值,fmt.Printf打印地址需要用%p
func main() {
	a := []int{1, 3, 4}

	println(a)     // a[0]地址
        fmt.Println(a) // a值

	fmt.Println(&a)                            // &a值
	fmt.Printf("切片a的地址:%p\n", &a)         // a地址
	fmt.Printf("切片a[0]的地址:%p\n", &(a[0])) // a[0]地址
}
输出:
[3/3]0xc0000ae0c0
[1 3 4]
&[1 3 4]
切片a的地址:0xc000098060
切片a[0]的地址:0xc0000ae0c0

2、格式化字符

很好的教程:https://www.jianshu.com/p/66aaf908045e

占位符 类型 说明 举例 输出
%v 1)普通占位符 相应值的默认格式。 Printf("%v", people)
%T 1)普通占位符 相应值的类型的Go语法表示 Printf("%T", people) main.Human
%t 2)布尔占位符 true 或 false Printf("%t", true) true
%b 3)整数占位符 二进制表示 Printf("%b", 5) 101
%d 3)整数占位符 十进制表示 Printf("%d", 0x12) 18
%o 3)整数占位符 八进制表示 Printf("%d", 10) 12
%x 3)整数占位符 十六进制表示,字母形式为小写 a-f Printf("%x", 13) d
%X 3)整数占位符 十六进制表示,字母形式为大写 A-F Printf("%x", 13) D
%c 3)整数占位符 相应Unicode码点所表示的字符 Printf("%c", 0x4E2D)
%q 3)整数占位符 单引号围绕的字符字面值,由Go语法安全地转义 Printf("%q", 0x4E2D) '中'
%U 3)整数占位符 Unicode格式:U+1234,等同于 "U+%04X" Printf("%U", 0x4E2D) U+4E2D
%b 4)浮点数和复数的组成部分(实部和虚部) 无小数部分的,指数为二的幂的科学计数法, 与 strconv.FormatFloat 的 'b' 转换格式一致。例如 -123456p-78
%x 5)字符串与字节切片 十六进制,小写字母,每字节两个字符 Printf("%x", "golang") 676f6c616e67
%X 5)字符串与字节切片 十六进制,大写字母,每字节两个字符 Printf("%X", "golang") 676F6C616E67
%q 5)字符串与字节切片 双引号围绕的字符串,由Go语法安全地转义 Printf("%q", "Go语言") "Go语言"
%p 6)指针 十六进制表示,前缀 0x Printf("%p", &people) 0x4f57f0

3、不同类型输出

可以先看:go数据类型

(1)go输出数值类型

fmt.Printf("a = %d", a) //同C的格式化输出语法。
fmt.Println("s1" + "s2") // 字符串用+连接,无空格
fmt.Println(a,b) // 空格隔开
var s = fmt.Sprintf() // fmt.Sprintf 来格式化字符串, 语法:fmt.Sprintf(格式化样式, 参数列表…),返回值是string

// 注意:fmt.Printf(123)会报错,因为Printf直接只能输出string,不能输出其他类型。若格式化,则按照格式化样式匹配后面的参数表输出。

(2)go输出slice

fmt.Println打印的slice是数值,fmt.Printf打印地址需要用%p

  • 内置函数print默认打印的是slice[0]的地址,不建议用。
func main() {
	a := []int{1, 3, 4}
        fmt.Println(a) // a值
	fmt.Println(&a)                            // &a值
	fmt.Printf("切片a的地址:%p\n", &a)         // a地址
	fmt.Printf("切片a[0]的地址:%p\n", &(a[0])) // a[0]地址
}
输出:
[1 3 4]
&[1 3 4]
切片a的地址:0xc000098060
切片a[0]的地址:0xc0000ae0c0
posted on 2022-03-04 10:40  西伯尔  阅读(317)  评论(0编辑  收藏  举报