Go 語言原則上不支持內存的直接操作訪問,但是提供了切片功能。
最初我以為切片就是動態數組,實際程序設計過程中發現,切片是提供數組一個內存片段的一個合法的手段,利用切片功能,實際上我們可以自由訪問數組的任何一個片段,因而可以借助 copy 函數,實現內存復制。
不同類型之間的數據復制,可以借助 unsafe 取出變量地址,類型轉換為數組后,利用數組切片,實現內存復制。
不羅嗦了,示例代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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]
補充:go語言之切片復制與追加
看代碼吧~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package main import ( "fmt" ) func main() { // copy示例 // 創建一個新的更大的切片并把原分片的內容都拷貝過來 sl_from := []int{1, 2, 3} sl_to := make([]int, 10) n := copy(sl_to, sl_from) fmt.Println("num:", n, "items", sl_to) // append追加元素 // append 方法將0個或多個具有相同類型 s 的元素追加到切片后面并且返回新的切片 // 追加的元素必須和原切片的元素同類型 // 如果 s 的容量不足以存儲新增元素,append 會分配新的切片來保證已有切片元素和新增元素的存儲 sl_a := []int{1, 2, 3} sl_a = append(sl_a, 4, 5, 6) fmt.Println(sl_a) // append 方法追加一個切片 var sl_b []int sl_c := []int{1, 2, 3} sl_b = append(sl_b, sl_c...) fmt.Println(sl_b) // 將一個元素快速轉為對應切片類型 x := 5 Test([]int{x}) } func Test(x []int) { fmt.Println(x) } |
運行結果:
num: 3 items [1 2 3 0 0 0 0 0 0 0]
[1 2 3 4 5 6]
[1 2 3]
[5]
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。
原文鏈接:https://yeping.blog.csdn.net/article/details/80472035