Go 结构指针的切片成员未更新
代码如下:Go 结构指针的切片成员未更新,go,slice,Go,Slice,代码如下: type T struct { list []bool flag bool length uint64 } func (o *T) Print() error { o.increase(newSize) o.list[newSize] = true } func (obj *T) increase(neeSize uint64) { newBufferSize := 2 * newSize
type T struct {
list []bool
flag bool
length uint64
}
func (o *T) Print() error {
o.increase(newSize)
o.list[newSize] = true
}
func (obj *T) increase(neeSize uint64) {
newBufferSize := 2 * newSize
tempSeq := NewReceiverSequence(newBufferSize)
copy(tempSeq.sequence, obj.sequence)
obj = tempSeq
return
}
在调试过程中,在
Print()
中,我们看到o.increase(newSize)
没有更新o
的成员,在increase
中有行obj=tempSeq
,因此产生了错误:
运行时错误:索引超出范围[19],长度为10
用于线路
o.list[newSize] = true
10
是调用o.increase(newSize)
为什么
increase()
在调用o.increase(newSize)
后不更新?行obj=tempSeq
只是将接收器指针分配给一个新指针。该赋值的效果在该方法外部不可见,因为您不是在更新该指针指向的对象的内容,而是在更新指针以指向新结构。一旦方法返回,调用方将继续使用未修改的对象
试试
*obj=*tempSeq
是深度拷贝吗?不是,它是浅拷贝。浅拷贝,你的意思是,片头被拷贝,但不是底层数组。布尔值被复制。复制长度值。正确吗?正确的是Print()
中的newNumber
是什么?这是从哪里来的?@Flimzy我想,对于这个问题来说,这不是一个相关的问题。不是吗?提供答案总是与问题相关的。@Flimzy对此我很抱歉。我会从下次开始努力提高