go中空struct{}的用途

在 Go 语言中,空的 struct{} 类型主要用于占位,可以在需要一个类型而不需要任何值的场景中使用。

一个典型的应用场景是使用空的 struct{} 类型作为 channel 的数据类型,用来通信。

例如,在并发编程中,我们可以使用空的 struct{} 类型来实现信号量,具体示例如下所示:

package main

import (
    "fmt"
)

func main() {
    semaphore := make(chan struct{}, 3)
    for i := 0; i < 3; i++ {
        go func(id int) {
            semaphore <- struct{}{}
            fmt.Println(id, "start")
            // do something
            fmt.Println(id, "end")
            <-semaphore
        }(i)
    }
}

在上面的代码中,我们定义了一个信号量 semaphore,初始容量为 3,用来限制并发的数量。每个 goroutine 在执行之前都会从信号量中获取一个许可,执行完成后再将许可释放。这样,同时最多只能有 3 个 goroutine 运行,可以保证程序的并发安全。

除了用作信号量,空的 struct{} 类型还有其他应用场景。例如,我们可以使用空的 struct{} 类型作为 map 的键类型,来实现一个 set 数据结构。

``` package main

import "fmt"

type set map[struct{}]struct{}

func main() { s := make(set) s.add(1) s.add(2) s.