无法在地图中分配给struct字段

时间:2018-05-07 19:51:42

标签: go

我想设置一个默认值,如果没有在结构中设置,我想设置它。这有点令人困惑,但请看一下(简化的)代码:

package main

import "log"

type Something struct {
    A string
    B map[string]Type
    C Epyt
}
type Type struct {
    A Epyt
    B string
}

type Epyt struct {
    A string
    B string
}

func main() {
    var a Something
    a.A = "Test A (Something)"
//  var a.B["one"] Type
    a.B["one"].A.A = a.B["one"].A.A
    a.B["one"].A.A = "Test A ([one]Type.Epyt)"
    a.B["two"].A.A = "Test A ([two]Type.Epyt)"  
    a.C.A = "Test A (Epyt)"
    a.C.B = "Test B (Epyt)"

    for i := range a.B {
        if a.B[i].A.B == "" {
            a.B[i].A.B = a.C.B
        }
    }
    log.Printf("%+v", a)
}

我正在使用viper解组配置文件,因此我无法使用指针(或者我错了?)。

我得到的错误,无法在地图中分配给结构字段***。

我发现这是一个老问题,仍然没有得到纠正。

我已阅读Why do I get a "cannot assign" error when setting value to a struct as a value in a map?Golang: I have a map of structs. Why can't I directly modify a field in a struct value?但正如我所说,我无法使用指针(或?)进行操作,因此请不要将其标记为重复因为它不是!

如果有人知道如何做到这一点,请帮忙!

2 个答案:

答案 0 :(得分:1)

我玩了一下,让它运转起来!我认为有一个错误,因为如果我在整个结构上使用printf,我会得到地址而不是值。很抱歉给您带来不便!

正如@mkopriva告诉我的那样,我试图使用指针。经过一些错误,我到目前为止工作!排除了这个脑虫;)

再次感谢你!

答案 1 :(得分:0)

您尚未初始化地图。

尝试

var a Something
a.B = make(map[string]Type)

此外,您所指的结构都不存在。

是的,而不是:

a.B["one"].A.A = ...

你应该这样做:

a.B["one"] = Type{
    A: Epyt{
        A: "test",
        B: "foo",
    },
    B: "something",
}