2 回答

TA貢獻2065條經驗 獲得超14個贊
在 Golang 中提到:
映射和切片值的行為類似于指針:它們是包含指向底層映射或切片數據的指針的描述符。復制映射或切片值不會復制它指向的數據。
您附加到切片的方式s是通過將 Test 結構的副本添加到切片來創建一個新切片s。因此,您沒有設置指向原始Test結構的指針。因此,如果結構內部的數據發生變化,它也會反映在切片中。這就是你面臨的問題。
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 時創建一個指向結構的指針s,每當您更改原始結構中的元素時,它都會反映更改。例如:
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貢獻1859條經驗 獲得超6個贊
這是由事實引起的,即initial
變量與s[0]
- 它們是兩個自Test
變量并且附加到一個不會改變第二個。initial
傳遞給時按值復制到不同的對象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 關注
- 161 瀏覽
添加回答
舉報