是的,当 slice1 是 nil slice 或 empty slice 时,使用 %v 格式化输出确实会显示为 [][4][5]。
%v 格式化 slice 的行为
根据Go的fmt包规范,slice使用 %v 会按照 [elem0 elem1 ...] 的格式显示[6]:
1var slice1 []int // nil slice
2slice2 := []int{} // empty slice
3slice3 := []int{1, 2, 3} // 有元素的slice
4
5fmt.Printf("%v\n", slice1) // 输出: []
6fmt.Printf("%v\n", slice2) // 输出: []
7fmt.Printf("%v\n", slice3) // 输出: [1 2 3]区分 nil slice 和 empty slice
虽然 %v 输出都是 [],但可以通过其他方式区分:
1var slice1 []int // nil slice
2slice2 := []int{} // empty slice
3
4// 使用 %#v 查看Go语法表示
5fmt.Printf("%#v\n", slice1) // 输出: []int(nil)
6fmt.Printf("%#v\n", slice2) // 输出: []int{}
7
8// 直接检查是否为nil
9fmt.Printf("%t\n", slice1 == nil) // 输出: true
10fmt.Printf("%t\n", slice2 == nil) // 输出: false其他格式化选项
如果需要更详细的信息,可以使用不同的格式化动词[1][3]:
%v: 默认格式 -[]%#v: Go语法表示 -[]int(nil)或[]int{}%T: 类型信息 -[]int%p: 指针地址 - 显示底层数组的地址
所以 [] 的输出是正常的,这表示slice的长度为0,但要确定是否为nil还需要其他方法来检查。
[1] https://stackoverflow.com/questions/24489384/how-to-print-the-values-of-slices [2] https://www.tutorialspoint.com/golang-program-to-print-a-slice [3] https://www.bytesizego.com/blog/golang-format-string [4] http://xahlee.info/golang/golang_print_slice.html [5] https://www.w3schools.com/go/go_slices.php [6] https://pkg.go.dev/fmt [7] https://go.dev/tour/moretypes/7 [8] https://www.reddit.com/r/golang/comments/1bjx1wz/separators_for_slices_output/ [9] https://github.com/golang/go/issues/44278 [10] https://gosamples.dev/print-address/