package main
import "fmt"
func main() {
var t=make([]int,0,10)
var s=make([]int,0,10)
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",t,len(t),t);
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",s,len(s),s);
t =append(s,1,2,3,4)
fmt.Println(t)
fmt.Println(s)
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",t,len(t),t);
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",s,len(s),s);
}
result:
addr:0x1044c030 len:0 content:[]
addr:0x1044c060 len:0 content:[]
[1 2 3 4]
[]
addr:0x1044c060 len:4 content:[1 2 3 4]
addr:0x1044c060 len:0 content:[]
一开始两个切片地址不同,可以理解。
后面我进行append,容量足够的情况下,切片地址是不会变的,那为什么s和t
的地址是一样的,它们的内容却不一样?
@xxdd11223 首先你要知道slice是两级结构:底层数组 + 描述slice的struct,该struct包含了指向底层数组的指针,slice的长度和容量,也就是代码里的
t
和s
. 关于slice的具体结构可见golang官方的go-slices-usage-and-internals.我在你的代码里加了注释和其他辅助代码,你可以对照起来看: