2 回答
TA贡献2065条经验 获得超13个赞
在 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 关注
- 129 浏览
添加回答
举报