为了账号安全,请及时绑定邮箱和手机立即绑定

Go Pointers - 通过指针将值附加到切片

Go Pointers - 通过指针将值附加到切片

Go
MMMHUHU 2022-01-17 18:19:27
我有一个结构 ProductData 及其实例 p ,它有一个 slice 属性:type ProductInfo struct {    TopAttributes []map[string]interface{}}我想设置 TopAttributes 如下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)}但这似乎不起作用。但是,当我将方法定义为时,还有另一种方法可以正常工作:   func (p *ProductInfo) setAttributeData() {    key := "key"    value := "value"    p.setAttribute(key, value)}func (p *ProductInfo) setAttribute(key string, value interface{}) {    val := map[string]interface{}{        key: value,    }    p.TopAttributes = append(p.TopAttributes, val)}我想知道为什么它不起作用。我的代码没有错误,但传入的数据是空的。我试图这样做以使其成为通用函数,因为我有另一个必须以相同方式设置的 BottomAttributes。
查看完整描述

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)

}


查看完整回答
反对 回复 2022-01-17
?
侃侃无极

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)

}


查看完整回答
反对 回复 2022-01-17
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

简而言之,虽然我们可以使用 slice 来修改源数据,但是对于 slice 本身,当作为函数的参数时,它只是将副本传递给函数。所以,你的代码是这样的


func test(i int) {

    i = i + 1

}

var a int = 3

test(a)


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号