空结构体

结构体是存放了一系列有命名的元素,又被称为字段,每个字段都有自己的名字和类型。空结构体就是指没有字段的结构体,例如下面这个匿名空结构体:

// 译者注:再次提示,这里的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时,字段值用空结构体填充是很好的选择。

最后更新于