golang slice的问题

var s []int = []int{}
fmt.Printf("%p, %v \n", s, s)

s1 := make([]int, 0)
fmt.Printf("%p, %v \n", s1, s1)

以上运行结果:


0x11b540, []
0x11b540, []

运行了很多遍都是这个结果,指向的数组地址怎么都是一样的,而且还是0x11b540这个地址。求解惑?

已邀请:

silentred

赞同来自: tupunco ofttryaj lifesohard 傅小黑 nt

https://github.com/golang/go/blob/272032d0b245635ca0c5ca4c22e64496174b2ae3/src/runtime/malloc.go#L543


func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
if gcphase == _GCmarktermination {
throw("mallocgc called with gcphase == _GCmarktermination")
}

if size == 0 {
return unsafe.Pointer(&zerobase)
}

andylau004

赞同来自:

确实诡异。。。


坐等大牛解答

stevewang

赞同来自:

和slice相关的地址有两个:slice对象本身的地址,slice所指向的对象的地址。你要的是哪个呢?
如果是要slice对象本身的地址,应该这么获得:


func main() {
var s []int = []int{0}
fmt.Printf("%p\n", &s)

s1 := make([]int, 1)
fmt.Printf("%p\n", &s1)
}

如果是要获取底层对象的地址:


func main() {
var s []int = []int{0}
fmt.Printf("%p\n", &s[0])

s1 := make([]int, 1)
fmt.Printf("%p\n", &s1[0])
}

tupunco

赞同来自:

我猜这个地址是 slice 初始地址, 跟类型无关.
var sb []byte = []byte{} 这样地址也一样.

lifesohard - 菜鸡

赞同来自:

我测试了下

var s []int = []int{}
k := []float32{}
s1 := make([]int,0)
fmt.Printf("%p,%p,%p",s,k,s1)
结果都是一样的,是不是slice结构体 指向底层数组的指针初始化的时候 由于没有实际值 都指向一个地方了

要回复问题请先登录注册