Go 将数据添加到结构中的接口{}

Go 将数据添加到结构中的接口{},go,struct,interface,Go,Struct,Interface,我想在结构sample中的fmt.Println下面main()中fmt.Println添加一个数据{“foo2”:“bar2”} 剧本 我的测试 我在下面试过了 测试1: 发生错误。它的类型接口{}不支持索引 测试2: 没有错误{“foo2”:“bar2”}可以添加 第二次测试是有效的还是通用的方法?如果有直接添加数据或其他方法,请您教我。 非常感谢您抽出时间。很抱歉,我提出了一个不成熟的问题。如果您将结构的定义更改为: type sample struct { data map[st

我想在结构
sample
中的
fmt.Println
下面
main()中
fmt.Println
添加一个数据
{“foo2”:“bar2”}

剧本 我的测试 我在下面试过了

测试1: 发生错误。它的
类型接口{}不支持索引

测试2: 没有错误<代码>{“foo2”:“bar2”}
可以添加

第二次测试是有效的还是通用的方法?如果有直接添加数据或其他方法,请您教我。
非常感谢您抽出时间。很抱歉,我提出了一个不成熟的问题。

如果您将结构的定义更改为:

type sample struct {
    data map[string]interface{}
}
它应该会起作用

那为什么呢?因为您将数据定义为
接口{}
。但你知道这不是地图,而是一个空界面。为什么它不是一张地图?因为它也可以是int、string或其他结构。因此,您不能像其他类型一样使用该类型


在您的示例中,您总是使用
data
作为映射,因此解决方案是将数据定义为类型
map[string]interface{}

我不知道出于什么原因,您希望使用空接口类型而不是map[string]interface{}类型,但这是可以做到的

type sample struct {
    data interface{}
}

func (s *sample) func1() {
    obj := map[string]interface{}{}
    obj["foo1"] = "bar1"
    s.data = obj
}

func (s *sample) addField(key, value string) {
    v, _ := s.data.(map[string]interface{})
    v[key] = value
    s.data = v
}

func main() {
    s := &sample{}
    s.func1()
    fmt.Println(s)

    s.addField("foo2", "bar2")
    fmt.Println(s)

}
每次要添加值时,必须将接口强制转换为map[string]接口{}。这也可以用来检索一个值,我相信您可以使用我提供的方法添加另一个方法


我建议不要这样做。要么您总是有一个map[string]接口{},因此您应该将其作为数据的类型,要么您必须小心,因为不能保证您有一个map[string]接口{},因此您必须相应地处理它

这是行不通的。
map[string]接口{}
实现空接口,但您希望使用空接口作为映射。这样就不行了。谢谢你的建议。但我很抱歉。我知道当使用
数据映射[string]接口{}
时,可以使用
s.data[“foo2”]=“bar2”
。我的问题是如何解决下面的
//在这里,我想将{“foo2”:“bar2”}添加到s.data
。所以
数据接口{}
也是一个条件。对不起,我解释得不好。谢谢你的建议。我可以为我找到一个解决办法。我很抱歉我的技术很差。
obj := map[string]interface{}{}
t, _ := json.Marshal(s.data)
json.Unmarshal(t, &obj)
obj["foo2"] = "bar2"
fmt.Println(obj)
type sample struct {
    data map[string]interface{}
}
type sample struct {
    data interface{}
}

func (s *sample) func1() {
    obj := map[string]interface{}{}
    obj["foo1"] = "bar1"
    s.data = obj
}

func (s *sample) addField(key, value string) {
    v, _ := s.data.(map[string]interface{})
    v[key] = value
    s.data = v
}

func main() {
    s := &sample{}
    s.func1()
    fmt.Println(s)

    s.addField("foo2", "bar2")
    fmt.Println(s)

}