2 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個贊
在 Golang 中提到:
映射和切片值的行為類似于指針:它們是包含指向底層映射或切片數(shù)據(jù)的指針的描述符。復(fù)制映射或切片值不會復(fù)制它指向的數(shù)據(jù)。
您附加到切片的方式s是通過將 Test 結(jié)構(gòu)的副本添加到切片來創(chuàng)建一個新切片s。因此,您沒有設(shè)置指向原始Test結(jié)構(gòu)的指針。因此,如果結(jié)構(gòu)內(nèi)部的數(shù)據(jù)發(fā)生變化,它也會反映在切片中。這就是你面臨的問題。
initial.elems = append(initial.elems, "apple")
fmt.Println(initial.elems) // #1 [apple]
s := make([]Test, 0) // this should be pointer to the struct to have teh changes in future to original struct.
s = append(s, initial) // appending to the s slice
Test在制作 slice 時創(chuàng)建一個指向結(jié)構(gòu)的指針s,每當(dāng)您更改原始結(jié)構(gòu)中的元素時,它都會反映更改。例如:
package main
import "fmt"
type Test struct {
elems []string
}
func main() {
initial := Test{
elems: make([]string, 0),
}
initial.elems = append(initial.elems, "apple")
fmt.Println(initial.elems) // #1 [apple]
s := make([]*Test, 0) // create a pointer to Test struct.
s = append(s, &initial)
initial.elems = append(initial.elems, "bannana")
fmt.Println(initial.elems) // #2 [apple bannana]
fmt.Printf("%+v\n",*s[0]) // #3 [apple banana]
second := s[0]
second.elems = append(second.elems, "carrot")
fmt.Println(second.elems) // #4 [apple bannana carrot]
}
輸出:-
[apple]
[apple bannana]
{elems:[apple bannana]}
[apple bannana carrot]
Go Playground上的工作代碼

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個贊
這是由事實(shí)引起的,即initial
變量與s[0]
- 它們是兩個自Test
變量并且附加到一個不會改變第二個。initial
傳遞給時按值復(fù)制到不同的對象append()
證明:
fmt.Printf("second: %p, initial: %p\n", &second.elems[0], &initial.elems[0])
(其中second.elems[0] == "apple"
和initial.elems[0] == "apple"
)輸出
second: 0xc00000a120, initial: 0xc00000a0c0
這表明這是真的
- 2 回答
- 0 關(guān)注
- 170 瀏覽
添加回答
舉報