考虑这个例子:
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个切片是否是对同一个内存的引用?
修改
我想要比较的切片可能不会指向底层内存块的同一段。
答案 0 :(得分:5)
您可以导入"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())
}
这会测试切片开始的位置,而不仅仅是基础数组。
答案 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