Go 语言的切片与内存复制 memcpy 的实现方法

Go 语言原则上不支持内存的直接操作访问,但是提供了切片功能。最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实际上我们可以自由访问数组的任何一个片段,因而可以借助 copy 函数,实现内存复制。

不同类型之间的数据复制,可以借助 unsafe 取出变量地址,类型转换为数组后,利用数组切片,实现内存复制。

不罗嗦了,示例代码如下:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    //数组之间的数据复制
    var a = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    var b = [10]int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
    copy(a[5:8], b[0:])
    fmt.Println(a, b)

    //不同数据类型之间的复制
    var c uint32 = 0x04030201
    var d [4]byte
    p := unsafe.Pointer(&c)
    q := (*[4]byte)(p)
    copy(d[0:], (*q)[0:])
    fmt.Println(d)
}

运行结果:
[0 1 2 3 4 -1 -1 -1 8 9] [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
[1 2 3 4]

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/80472035
今日推荐