我有一个struct 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)
}

我想找出它为什么不工作.我的代码中没有错误,但是传入的数据是空的. 我try 这样做是为了使它成为一个泛型函数,因为我还有另一个必须以相同方式设置的BottomAttributes.

推荐答案

append返回对附加到切片的引用.这是因为如果需要调整大小,它可以指向内存中的新位置.

在第一个示例中,您要更新传递给setAttribute函数的变量,但仅此而已.当该函数退出时,唯一的引用将丢失.

它在第二个示例中有效,因为该变量存在于 struct 中,因此会被更新.

您可以使用指针修复第一个版本:

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)
}

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

在Uber FX中实现后台进程正常关闭的正确方式是什么?

如何解析Go-Gin多部分请求中的 struct 切片

Golang Docker Selenium Chrome

如何从Go项目连接Microsoft Access数据库?

闭包所处的环境范围是什么?

是否可以从 golang 中的参数推断类型?

泛型:实现嵌套接口

如何将整数哈希细分为范围

在嵌套模板中使用变量,它也被定义为 go 模板中的变量?

转换朴素递归硬币问题时的记忆错误

如何将一片 map 转换为一片具有不同属性的 struct

如何在自定义验证函数中获取 struct 名称

Golang 数据库/sql 与 SetMaxOpenConns 挂起

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

通用函数与外部包中的常见成员一起处理不同的 struct ?

Go:用于 XML 解码的嵌套 struct 中的提升字段

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?

如何在 Prometheus 中正确检测区域和环境信息?