跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang 中 array 和 slice 互相转化
未分類
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
    “`go
    func 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

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具