【问题标题】:slice member of a struct pointer is not updated [closed]结构指针的切片成员未更新[关闭]
【发布时间】:2020-10-17 17:56:04
【问题描述】:

下面是代码:

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) 之前o.sequence 的大小


为什么在调用o.increase(newSize)increase() 没有更新?

【问题讨论】:

  • Print() 中的newNumber 是什么?它来自哪里?
  • @Flimzy 我认为,对于这个查询,这不是一个相关的问题。不是吗?
  • 提供Minimal, reproducible example 始终与问题相关。
  • @Flimzy 很抱歉。下次我会努力改进的

标签: go slice


【解决方案1】:

obj=tempSeq 行只是将接收者指针分配给一个新指针。该分配的效果在该方法之外不可见,因为您没有更新该指针指向的对象的内容,而是更新了指向新结构的指针。一旦方法返回,调用者继续使用未修改的对象。

试试*obj=*tempSeq

【讨论】:

  • *obj=*tempSeq 是深拷贝吗?
  • 不,是浅拷贝。
  • 浅拷贝,你的意思是,切片头被复制但不是底层数组。布尔值被复制。长度值被复制。对吗?
  • 没错
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
相关资源
最近更新 更多