# 空结构体

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

```go
// 译者注：再次提示，这里的s是结构体实例化之后的变量名
// 该结构体本身没有名字，所以叫匿名结构体
var s struct{}
```

空结构体也可以是像下面这样的具名结构体：

```go
// 译者注：这里的结构体名字为T
type T struct{}

// 译者注：理解变量名和结构体名的区别了吗？
var s T
```

有趣的是，空结构体的长度(所占内存大小)为0。

```go
fmt.Println(unsafe.Sizeof(s))    // 输出0
```

鉴于空结构体所占内存为0，所以用它退出channel是很好的选择：

```go
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.")
}
```

{% hint style="warning" %}

#### 译者注

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