Go 語言的切片與記憶體複製 memcpy 的實現方法
阿新 • • 發佈:2019-02-04
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]