在Go语言中,关键字'struct'所在行中的两个花括号是什么意思?[closed]

dkqlctbz  于 2022-12-28  发布在  Go
关注(0)|答案(1)|浏览(130)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

昨天关门了。
Improve this question
当我在Golang使用map时,我遇到了一个奇怪的形状。我用关键字“使用struct时使用两个花括号”搜索了一下,但是没有找到。下面这样使用两组花括号(如“struct{}{}”)是什么意思?

menu := map[string]interface{}{
"icecream": "delicious",
"eggs":struct {
    price float64 
}{"chicken", 1.75}   }
uujelgoq

uujelgoq1#

让我们来分析一下:

menu := map[string]interface{}{

创建一个变量menu,类型为map[string]interface{}interface{}是任何类型,它实现了一个没有方法的接口,所以基本上任何类型都可以赋值)。最后一个左括号是这个Map中包含的实际数据可以写入的地方,所以:

foo := map[string]int{}
foo["bar"] = 1

可以写成

foo := map[string]int{
   "bar": 1,
}

现在,在代码中,第一个键值对很简单:

"icecream": "delicious",

第二个是你不清楚的:

"eggs":struct {
    price float64 
}{"chicken", 1.75}   }

现在这段代码不会被编译,但是让我们把它修改成可以编译的代码:

"eggs":struct {
    kind  string
    price float64 
}{"chicken", 1.75}   }

我们在这里要做的是向menyMap添加一个键(类型map[string]any),并且赋给键eggs的值是一个结构体,具体来说是一个包含2个字段的匿名结构体:

struct {
    kind  string
    price float74
}

我们希望将字段设置为特定的值,因此必须初始化此结构体:

struct {
    kind  string
    price float64 
}{"chicken", 1.75}

这与写作是一样的:

eggs := struct{
    kind  string
    price float64
}{
    kind:  "chicken",
    price: 1.75,
}

或者甚至:

type Egg struct {
    kind  string
    price float64
}

menu := map[string]any{
    "icecream": "delicious",
    "eggs": Egg{
        kind:  "chicken",
        price: 1.75,
    },
}

这里让你困惑的可能是在初始化结构体时忽略了字段(这被认为是错误的形式,只有在字段的顺序被保留的情况下才能真正起作用。

menu := map[string]any{
    "icecream": "delicious",
    "eggs": struct{
        kind  string
        price float64
    }{
        kind:  "chicken",
        price: 1.75,
    },
}

那么下面的代码将无法工作:

menu := map[string]any{
    "icecream": "delicious",
    "eggs": struct{
        kind  string
        price float64
    }{
        1.75, // first field in struct is expected to be a string
    },
}

但这将:

menu := map[string]any{
    "icecream": "delicious",
    "eggs": struct{
        kind  string
        price float64
    }{
        price: 1.75,
    },
}

总的来说,在测试之外,或者在不需要使用/分离数据子集的情况下,在用于编组(反编组)大型数据集的类型中,这样的事情并不常见。我想我上一次在代码中使用这种匿名结构是在我必须接收和传递XML数据块,但不对它进行任何处理的时候,我会创建这样的类型:

type XMLInput struct {
    // fields of data I actually needed to use
    Details struct {
        // fields that I needed to make sure were set, but didn't do any processing on, so I didn't need a usable type
    } `xml:"whatever_tag"`
}

相关问题