例如,如果我们具有以下接口:
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)) }
然后在我们的主要功能中,如果我们想测试一下,将无法正常工作:
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)
我想念什么?:-)
的接收者func (this Route) AddChildren (child globals.IRoute)是一个值,因此您正在更改Route结构的副本。
func (this Route) AddChildren (child globals.IRoute)
Route
更改为 func (this *Route) AddChildren (child globals.IRoute)
func (this *Route) AddChildren (child globals.IRoute)