Go语言空结构体字面量为何在map中合法但通道发送不合法?
问题核心:Go复合字面量的类型推断上下文限制
这是Go语法层面专门对复合字面量做的规则限制,两者的合法与否完全取决于上下文是否支持省略类型前缀:
map场景{}合法的原因
你定义的map类型是map[string]struct{},value的类型已经明确是无字段的空结构体struct{}。Go规范明确允许:在元素类型已知的数组、切片、map字面量内部,元素的复合字面量可以省略类型前缀,编译器会自动用容器的元素类型补全。所以这里的{}会被直接识别为struct{}{},完全合法。
类似的合法省略还有:
// 切片元素类型明确为struct{},内部元素可以省略类型 sl := []struct{}{{}, {}, {}}
通道发送场景{}不合法的原因
通道发送语句c <- {}中,<-右侧的值位置,不属于Go允许省略复合字面量类型的上下文范围。
单独出现的{}没有任何类型标识,编译器没办法确定它到底是struct{}类型的值,还是其他结构体、map、切片的字面量,因此直接触发语法错误。你必须显式写出完整的空结构体字面量struct{}{},明确告知编译器值的类型和通道元素类型匹配,才能正常编译运行。
内容的提问来源于stack exchange,提问作者Jordan Bonecutter
相关产品推荐
相关产品推荐

