如何找到两个切片是否引用相同的内存?

时间:2013-05-30 14:25:56

标签: go slice

考虑这个例子:

sliceA := make([]byte, 10)
sliceB := make([]byte, 10)

// sliceA and sliceB are referencing different memory,
// witch eventually may contain same data

sliceC := sliceA[:]

// sclieC references same memory as sliceA
sliceD := sliceA[1:2]; sliceE := sliceA[4:5]
// assert that sliceD and sliceE share same block of memory

有没有办法检查2个切片是否是对同一个内存的引用?

修改

我想要比较的切片可能不会指向底层内存块的同一段。

3 个答案:

答案 0 :(得分:5)

您可以导入"reflect"

来测试地址
same := reflect.ValueOf(sliceA).Pointer() == reflect.ValueOf(sliceC).Pointer()

Example

package main

import (
    "fmt"
    "reflect"
)

func main() {
    sliceA := make([]byte, 10)
    sliceC := sliceA[1:]
    sliceD := sliceA[1:]
    fmt.Println(reflect.ValueOf(sliceC).Pointer() == reflect.ValueOf(sliceD).Pointer())
}

这会测试切片开始的位置,而不仅仅是基础数组。

答案 1 :(得分:3)

类型为[] T的两个非零实例a和b共享相同的后备数组iff

&a[cap(a)-1] == &b[cap(b)-1]

请注意,可能需要在测试之前重新分析a和b。

答案 2 :(得分:1)

@ canni的问题和@ jnml和@ dystroy的答案很混乱和困惑。

这是简单的版本。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    sliceA := make([]byte, 10)
    sliceD := sliceA[1:2]
    sliceE := sliceA[4:5]
    // assert that sliceD and sliceE share same block of memory
    canni := true
    jnml := &sliceD[:cap(sliceD)][cap(sliceD)-1] == &sliceE[:cap(sliceE)][cap(sliceE)-1]
    dystroy := reflect.ValueOf(sliceD).Pointer() == reflect.ValueOf(sliceE).Pointer()
    // true true false
    fmt.Println(canni, jnml, dystroy)
}

输出:

true true false