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结构体 指向底层数组的指针初始化的时候 由于没有实际值 都指向一个地方了

要回复问题请先登录注册