【问题标题】:Struct field not updated when implementing interface function实现接口功能时结构字段未更新
【发布时间】:2015-02-13 10:17:55
【问题描述】:

如果我们有如下接口:

type IRoute interface {
    AddChildren(child IRoute)
}

以下结构:

type Route struct {
    Alias string `json:"alias"`
    Children []Route `json:"children,omitempty"`
    Url string `json:"url,omitempty"`
}

并实现了接口:

func (this Route) AddChildren (child globals.IRoute){
    this.Children = append(this.Children, child.(Route))
}

然后在我们的 main func 中,如果我们想测试它是行不通的:

rSettings := Route{"settings", nil, "/admin/settings"}
rSettingsContentTypesNew := models.Route{"new", nil, "/new?type&parent"}
rSettingsContentTypesEdit := models.Route{"edit", nil, "/edit/:nodeId"}

// Does NOT work - no children is added
rSettingsContentTypes.AddChildren(rSettingsContentTypesNew)
rSettingsContentTypes.AddChildren(rSettingsContentTypesEdit)
rSettings.AddChildren(rSettingsContentTypes)

这确实按预期工作:

rSettings := Route{"settings", nil, "/admin/settings"}
rSettingsContentTypesNew := models.Route{"new", nil, "/new?type&parent"}
rSettingsContentTypesEdit := models.Route{"edit", nil, "/edit/:nodeId"}

// However this does indeed work
rSettingsContentTypes.Children = append(rSettingsContentTypes.Children,rSettingsContentTypesNew)
rSettingsContentTypes.Children = append(rSettingsContentTypes.Children,rSettingsContentTypesEdit)
rSettings.Children = append(rSettings.Children,rSettingsContentTypes)

我错过了什么? :-)

【问题讨论】:

    标签: interface go


    【解决方案1】:

    func (this Route) AddChildren (child globals.IRoute) 的接收者是一个值,因此您正在更改您的 Route 结构的副本。

    改成func (this *Route) AddChildren (child globals.IRoute)

    【讨论】:

    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2023-03-07
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多