golang nil传递给slice为啥不生效?

func f(links []string) {
    fmt.Printf("%v\t%#[1]p\n", links)  // []    0
}
f(nil)

我将nil传递给函数的形参slice links,link还是[],为啥没有生效呢?

最佳答案
// fmt.Printf() %v 解释代码
fmt.Printf() -> Fprintf() -> p.doPrintf() ->p.printArg() -> p.printValue()
p.printArg() 关键内容: case verb == 'v': ... fallthrough
// 根据源码流程可得知 verb 为 v,p.fmt.sharpV == false
p.printValue() 关键内容:case reflect.Array, reflect.Slice:

最后写入的核心源码:
            p.buf.writeByte('[')
            for i := 0; i < f.Len(); i++ {
                if i > 0 {
                    p.buf.writeByte(' ')
                }
                p.printValue(f.Index(i), verb, depth+1)
            }
            p.buf.writeByte(']')

// 结论:fmt 包在这个解析过程中,因要转换成 string 格式,所以得把 slice 转换成 string 格式,slice 的底层 array,试想在 string 格式如何体它是 array ?在 json 里面 array 又是怎样的格式,slice == nil ,长度为 0 容量为 0, 可得知底层的 array 就是个空 array。从源码得知数组、切片被 fmt 当成同一类来处理的,并且以 "[" 开头以 "]" 结尾来表示这是个数组或切片,它们中间为数组或切片的内容,并且以空格隔开
2年前 评论
讨论数量: 3

你试试 _ = links [0]

2年前 评论
iBebe (楼主) 2年前

为啥要生效?nil就是空,传空还想要变出什么来吗?

2年前 评论
// fmt.Printf() %v 解释代码
fmt.Printf() -> Fprintf() -> p.doPrintf() ->p.printArg() -> p.printValue()
p.printArg() 关键内容: case verb == 'v': ... fallthrough
// 根据源码流程可得知 verb 为 v,p.fmt.sharpV == false
p.printValue() 关键内容:case reflect.Array, reflect.Slice:

最后写入的核心源码:
            p.buf.writeByte('[')
            for i := 0; i < f.Len(); i++ {
                if i > 0 {
                    p.buf.writeByte(' ')
                }
                p.printValue(f.Index(i), verb, depth+1)
            }
            p.buf.writeByte(']')

// 结论:fmt 包在这个解析过程中,因要转换成 string 格式,所以得把 slice 转换成 string 格式,slice 的底层 array,试想在 string 格式如何体它是 array ?在 json 里面 array 又是怎样的格式,slice == nil ,长度为 0 容量为 0, 可得知底层的 array 就是个空 array。从源码得知数组、切片被 fmt 当成同一类来处理的,并且以 "[" 开头以 "]" 结尾来表示这是个数组或切片,它们中间为数组或切片的内容,并且以空格隔开
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!