Go 语言的切片与内存复制 memcpy 的实现方法
2023-09-27 14:20:16 时间
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]