2

考虑这个例子:

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 个切片是否是对同一内存的引用?

编辑

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

4

3 回答 3

6

您可以通过导入来测试地址"reflect"

same := reflect.ValueOf(sliceA).Pointer() == reflect.ValueOf(sliceC).Pointer()

示例

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())
}

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

于 2013-05-30T14:49:56.180 回答
4

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

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

请注意,在测试之前可能需要重新切片 a 和或 b。

于 2013-05-30T14:53:05.900 回答
0

@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
于 2013-05-30T16:20:57.430 回答