空结构体

结构体是存放了一系列有命名的元素,又被称为字段,每个字段都有自己的名字和类型。空结构体就是指没有字段的结构体,例如下面这个匿名空结构体:
// 译者注:再次提示,这里的s是结构体实例化之后的变量名
// 该结构体本身没有名字,所以叫匿名结构体
var s struct{}
空结构体也可以是像下面这样的具名结构体:
// 译者注:这里的结构体名字为T
type T struct{}
// 译者注:理解变量名和结构体名的区别了吗?
var s T
有趣的是,空结构体的长度(所占内存大小)为0。
fmt.Println(unsafe.Sizeof(s)) // 输出0
鉴于空结构体所占内存为0,所以用它退出channel是很好的选择:
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan struct{})
go func() {
time.Sleep(1 * time.Second)
close(done)
}()
fmt.Println("Wait...")
<-done
fmt.Println("done.")
}

译者注

自己手动维护特别的值退出channel目前已不算最佳实践。用结构体实现HashSet时,字段值用空结构体填充是很好的选择。