3 回答

TA贡献1856条经验 获得超11个赞
append返回对附加到切片的引用。这是因为如果需要调整大小,它可能会指向内存中的新位置。
在您的第一个示例中,您正在更新传递给setAttribute函数的变量,仅此而已。当该函数退出时,唯一的引用将丢失。
它在第二个示例中有效,因为该变量存在于您的结构中,因此会被更新。
您可以使用指针修复第一个版本:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(&p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}

TA贡献2051条经验 获得超10个赞
您正在尝试附加一个map用作函数参数的值,因此它具有本地范围,只能在函数内访问。因为这是通过值而不是指针地址引用的,所以它的访问仅限于它的本地范围。
映射类型是引用类型,如指针或切片,因此参数的p值为 nil;它不指向初始化的地图。
要将其指向地图,您必须通过它的指针访问:
func (p *ProductInfo) setAttributeData() {
key := "key"
value := "value"
setAttribute(p.TopAttributes, key, value)
}
func setAttribute(p *[]map[string]interface{}, key string, value interface{}) {
val := map[string]interface{}{
key: value,
}
*p = append(*p, val)
}

TA贡献1911条经验 获得超7个赞
简而言之,虽然我们可以使用 slice 来修改源数据,但是对于 slice 本身,当作为函数的参数时,它只是将副本传递给函数。所以,你的代码是这样的
func test(i int) {
i = i + 1
}
var a int = 3
test(a)
- 3 回答
- 0 关注
- 164 浏览
添加回答
举报