【问题标题】:Go interface slice and pointerGo 接口切片和指针
【发布时间】:2016-07-17 03:04:56
【问题描述】:

我想在一个拥有切片的结构上创建一个函数。 我的问题是:我想使用指针参数,因为我必须修改我的结构内容。

这是我的代码:

type CampaignIndexMemory []CampaignIndex

type CampaignIndex struct {
    Objects []CampaignIndexObject
}

type CampaignIndexObject struct {
    //They don't really care about us
}

func (c *CampaignIndexMemory) setCampaignIndex(object CampaignIndex) {

    valueSet := false
    for i,_ := range c {
        if c[i].Objects[0].ID == object.Objects[0].ID {
            c[i] = object
            valueSet = false
            break
        }
    }
    if valueSet {
        c = append(c, object)
    }
}

我来自 Java 世界(我深表歉意)所以也许我的处理方式是错误的。

使用此代码,编译出错并在我的“对象”属性上显示“未解析的引用”。

我的问题很简单:发生了什么事?

感谢您的帮助、您的时间和您的善意:)

【问题讨论】:

  • "我想在一个拥有切片的结构上创建一个函数。" 但是你的接收者不是struct,它是*CampaignIndexMemory,即一个指针到CampaignIndexes 的一部分。
  • 我刚刚将我的类型转换为结构,它运行良好。谢谢。这是我的新代码: type CampaignIndexMemory struct {indexes []CampaignIndex} 我只需要将我所有的 c[i] 替换为 c.indexes[i]

标签: arrays pointers go struct slice


【解决方案1】:

方法是在类型上定义的。 CampaignIndexMemory 不是 struct 而是 type。类型为“CampaignIndex 的切片”。

来自documentation about slices

切片保存对底层数组的引用,如果你分配一个 切片到另一个,两者都引用同一个数组。如果一个函数需要一个 切片参数,它对切片元素所做的更改将是 对调用者可见,类似于将指针传递给 底层数组。

这意味着您的方法setCampaignIndex 的接收者可能是slice,而不是指向切片的指针。更改将应用​​于调用方。

func (c CampaignIndexMemory) setCampaignIndex(object CampaignIndex) {

指向切片的指针指向slice header,所以我猜你得到的错误是因为切片标头不包含Object 字段。

【讨论】:

    猜你喜欢
    • 2017-10-03
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2017-07-04
    • 2018-05-30
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多