Golang fmt.Printf中%[3]v格式符使用疑问:参数与输出不符
Go fmt.Printf中%[3]v格式符的解析
你的困惑核心在于对Go fmt包中参数索引格式符的不了解,下面详细解释:
格式字符串拆解
你使用的格式字符串是:
"%d, %d, %T, %t, %#[3]v\n"
这里包含5个格式指令,对应逻辑如下:
%d→ 匹配第1个参数len(s1),输出0%d→ 匹配第2个参数cap(s1),输出0%T→ 匹配第3个参数s1,输出其类型[]int%t→ 匹配第4个参数s1 == nil,输出布尔值true%#[3]v→ 这里的[3]是参数索引标记,强制指定使用第3个参数(即s1);#是v格式的修饰符,会输出更贴近Go语法的字面量形式,所以对nil切片会输出[]int(nil)
关键知识点
Go的fmt包允许通过[n]语法重复引用已传入的参数,不需要为每个格式指令都传递新参数。也就是说,格式指令的数量可以大于传入参数的数量,只要通过索引复用已有参数即可。
你预期的输出是4个部分,是因为误以为格式指令数量和参数数量必须一一对应,但实际上格式字符串里有5个指令,其中第五个复用了第三个参数,所以会多输出[]int(nil)。
验证修改
如果想得到你预期的输出,只需要去掉格式字符串中的, %#[3]v部分,修改后的代码:
package main import "fmt" func main() { var s1 []int //s2 := []int{} fmt.Printf("%d, %d, %T, %t\n", len(s1), cap(s1), s1, s1 == nil) }
运行后会输出:
0, 0, []int, true
内容的提问来源于stack exchange,提问作者Subin Suthan
相关产品推荐
相关产品推荐

