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

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

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

预计我会收到一个错误:

missing type in composite literal

当然,我可以创建一个单独的 struct B 并以这种方式对其进行初始化:

type Btype struct {
    Some string
    Len int
}

type A struct {
    B Btype
}

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

但它并不比第一种方式有用。是否有初始化匿名结构的快捷方式?

4

3 回答 3

22

分配性规则对匿名类型是宽容的,这导致了另一种可能性,您可以保留原始定义,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)
}

操场


输出

&main.A{B:struct { Some string; Len int }{Some:"xxx", Len:3}}
于 2013-07-28T21:23:14.267 回答
5

这样做:

type Config struct {
    Element struct {    
        Name string 
        ConfigPaths []string 
    } 
}
config = Config{}
config.Element.Name = "foo"
config.Element.ConfigPaths = []string{"blah"}
于 2020-10-13T21:24:03.263 回答
0

这是更简单的imo:

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

a := A{
    struct {
        Some string
        Len  int
    }{"xxx", 3},
}
fmt.Printf("%+v", a)
于 2021-07-31T17:42:16.330 回答