未分類 17 7 月 2020 golang 中 array 和 slice 互相转化 golang 中 array 和 slice 互相转化 資深大佬 : accidentaly 13 如标题所描述对一下两者进行相互的装换,在不使用 copy 的情况下: var array [1024]byte var slice []byte 大佬有話說 (12) 主 資深大佬 : accidentaly 如: array —> slice : slice:=array[:] 那 slice–>array? 資深大佬 : rrfeng 不用 copy 是为啥 主 資深大佬 : accidentaly 因为 copy 实际上是比较慢的 資深大佬 : blackeeper @accidentaly slice–>array […]array := slice[:] 主 資深大佬 : accidentaly 你这样写是错的把 資深大佬 : maoxs2 好像转回来必须 copy,因为 slice 地址不一定是连续的 資深大佬 : maoxs2 copy 好像不算慢吧? append 这种在需要 alloc 时候才会比较慢 主 資深大佬 : accidentaly 挺慢的,我测试过了,要求性能高的最好不要 copy 主 資深大佬 : accidentaly slice 有一部分空间是没在被使用的 冗余空间,如果吧 slice 直接给转换成 array, 那部分冗余就可能会变成内存泄漏了,因为可能没有变量在持有他,所以 golang 不允许反过来的转换, unsafe 转化也是可以的 但是这样会造成泄漏 那就得不偿失了 資深大佬 : kiwi95 @maoxs2 slice 底层就是数组,怎么能不是连续的,slice 转最快的是定义一个和 slice 相同的 struct,然后指针转换,但可能存在越界之类的问题 資深大佬 : kiwi95 @kiwi95 “`gofunc TestSlice(t *testing.T) { var s1 = []int{1, 2, 3, 4, 5} var s2 [3]int type slice struct { Arr unsafe.Pointer len int cap int } ss := *(*slice)(unsafe.Pointer(&s1)) s2 = *(*[3]int)(ss.Arr) fmt.Println(“s2: “, s2)}“` 資深大佬 : maoxs2 嗯是我搞错了。reflect 里那个 SliceHeader 就是你这个 struct 了,但是这样用得用 keepalive 保留原 array 不然会被 gc