复合字面量中缺少类型

45
type A struct {
    B struct {
        Some string
        Len  int
    }
}

简单问题。如何初始化这个结构体?我想做类似这样的事情:

a := &A{B:{Some: "xxx", Len: 3}} 

意料之中,我遇到了一个错误:

missing type in composite literal

当然,我可以创建一个单独的结构体B,并用这种方式初始化它:

type Btype struct {
    Some string
    Len int
}

type A struct {
    B Btype
}

a := &A{B:Btype{Some: "xxx", Len: 3}}

但这种方法不如第一种有用。是否有一种初始化匿名结构的快捷方式?


2
@silasdavis 常识,那是2013年的事了。 - tacobot
在尝试将值设置为复合结构文字中的指针而不是内存地址时,我遇到了此错误。 - Janac Meena
3个回答

26

可赋值规则对于匿名类型是宽容的,这导致另一种可能性:您可以保留A的原始定义,同时允许编写该类型的短复合文字。如果您确实坚持使用 B 字段的匿名类型,我可能会写出以下代码:

package main

import "fmt"

type (
        A struct {
                B struct {
                        Some string
                        Len  int
                }
        }

        b struct {
                Some string
                Len  int
        }
)

func main() {
        a := &A{b{"xxx", 3}}
        fmt.Printf("%#v\n", a)
}

Playground


输出

&main.A{B:struct { Some string; Len int }{Some:"xxx", Len:3}}

2
如果字段的值是结构体切片,则此操作将失败。 - Zombo

9

按照以下方式操作:

type Config struct {
    Element struct {    
        Name string 
        ConfigPaths []string 
    } 
}

config = Config{}
config.Element.Name = "foo"
config.Element.ConfigPaths = []string{"blah"}

1
如果字段值是结构体切片,则此操作将失败。 - Zombo

2

我认为这更简单:


type A struct {
    B struct {
        Some string
        Len  int
    }
}

a := A{
    struct {
        Some string
        Len  int
    }{"xxx", 3},
}
fmt.Printf("%+v", a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接