我从 slice 中删除第一个元素时遇到了意外的结果,这是我的测试代码,希望能帮助你理解我混淆的定义结构
type A struct {
member int
}
func (a A) String() string {
return fmt.Sprintf("%v", a.member)
}
type B struct {
a A
aPoint *A
}
func (b B) String() string {
return fmt.Sprintf("a: %v, aPoint: %v", b.a, b.aPoint)
}
下面是我的测试用例
func TestSliceRemoveFirstEle(t *testing.T) {
demo := []B{
{a: A{member: 1}},
{a: A{member: 2}},
{a: A{member: 3}},
}
for i := range demo {
demo[i].aPoint = &demo[i].a
}
fmt.Println("demo before operation is ", demo) // result: demo before operation is [a: 1, aPoint: 1 a: 2, aPoint:2 a: 3, aPoint: 3]
demo = append(demo[:0], demo[1:]...)
fmt.Println("demo after operation is ", demo) // result: demo after operation is [a: 2, aPoint: 3 a: 3, aPoint: 3]
}
我的预期结果是[a: 2, aPoint: 2 a: 3, aPoint: 3]
当我使用另一种方式向切片添加元素时,它运行良好。
func TestAddSliceRemoveFirstEle(t *testing.T) {
demo := make([]B, 0, 3)
a1 := A{member: 1}
a2 := A{member: 2}
a3 := A{member: 3}
demo = append(demo, B{a: a1, aPoint: &a1}, B{a: a2, aPoint: &a2}, B{a: a3, aPoint: &a3})
fmt.Println("demo before operation is ", demo) // result: demo before operation is [a: 1, aPoint: 1 a: 2, aPoint: 2 a: 3, aPoint: 3]
demo = append(demo[:0], demo[1:]...)
fmt.Println("demo after operation is ", demo) // result: demo after operation is [a: 2, aPoint: 2 a: 3, aPoint: 3]
}
我对结果感到困惑,从切片中删除元素后第一种情况发生了什么,这两种实现之间有什么区别?