提出疑问
在Go的源码库或者其他开源项目中,会发现有些函数在需要用到切片入参时,它采用是指向切片类型的指针,而非切片类型。这里未免会产生疑问:切片底层不就是指针指向底层数组数据吗,为何不直接传递切片,两者有什么区别?
例如,在源码log包中,Logger
对象上绑定了formatHeader
方法,它的入参对象buf
,其类型是*[]byte
,而非[]byte
。
func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line int) {}
有以下例子
func modifySlice(innerSlice []string) {
innerSlice[0] = "b"
innerSlice[1] = "b"
fmt.Println(innerSlice)
}
func main() {
outerSlice := []string{
"a", "a"}
modifySlice(outerSlice)
fmt.Print(outerSlice)
}
// 输出如下
[b b]
[b b]
我们将modifySlice
函数的入参类型改为指向切片的指针
func modifySlice(innerSlice *[]string) {
(*innerSlice)[0] = "b"
(*innerSlice)[1] = "b"
fmt.Println(*innerSlice)
}
func main() {
outerSlice := []string{
&