struct 嵌入与空结构体
struct 嵌入字段是什么? 字段提升与组合复用如何工作?
- embedded field: 嵌入字段只写类型名或允许的指针类型,字段名由类型名隐式确定,并非真的没有名字;
- 字段提升: 可通过外层 struct 直接访问嵌入字段成员;
- 组合复用: Go 使用嵌入表达组合关系;
type Address struct {
City string
}
type User struct {
Name string
Address
}
u := User{Name: "Tom", Address: Address{City: "Beijing"}}
println(u.City) // Beijing
- 初始化边界: 提升字段只能便捷访问,外层复合字面量仍应写
Address: Address{...};方法提升与同名冲突见类型嵌入与方法提升;
空结构体是什么? 有哪些使用场景?
struct{}: 不包含字段的结构体;- 使用场景: set, 只传递信号的 channel;
func main() {
seen := map[string]struct{}{}
seen["go"] = struct{}{}
_, ok := seen["go"]
println(ok)
}
- 建模含义:
map[T]struct{}只记录键是否属于集合,chan struct{}只传递事件是否发生;两者都不需要额外业务载荷;