golang slice分割和append copy還是引用


轉載自:http://studygolang.com/articles/724

1.

slice1:= slice[0:2]

引用,非復制,所以任何對slice1或slice的修改都會影響對方

data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
data1 := data[0:2]
data1[0] = 99
fmt.Println(data1)
fmt.Println(data)

[99 2]

[99 2 3 4 5 6 7 8 9 0]

 

2.append

 

append 比較特殊

聲明:

源slice= src

添加slice = app

結果slice=tar

1)如果len(src) + len(app) <= cap(src)  src和tar 是指向同一數據引用 ,即修改src或tar,會影響對方

2)否則 tar 是copy的方式 src + app ,即修改src或tar,不會影響對方

無論哪種情況不會影響app,因為app都會用copy的方式進入tar

func test2() {
	data := make([]int, 10, 20)
	data[0] = 1
	data[1] = 2
	dataappend := make([]int, 10, 20)//len <=10 則 	result[0] = 99 會 影響源Slice
	dataappend[0] = 1
	dataappend[1] = 2
	result := append(data, dataappend...)
	result[0] = 99
	result[11] = 98
	fmt.Println("length:", len(data), ":", data)
	fmt.Println("length:", len(result), ":", result)
	fmt.Println("length:", len(dataappend), ":", dataappend)
}

3.
另外我自己補充一點:
其中CounterAdapter是一個結構體
    list := make([]CounterAdapter, 0)
    ca := CounterAdapter{}
    for i := 1; i <= 3; i++ {
        ca.Data.Cycle = int64(i)
        ca.Data.HostName = fmt.Sprintf("%d", i)
        list = append(list, ca)
    }
    fmt.Println(list)
輸出的list的3個結點分別是不一樣的,得出結果,append單個結構體是copy的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM