为什么要创建一个带空结构的类型?
type FrontierSigner struct{}
有什么好处?
答案 0 :(得分:17)
在Go中以特殊方式实现空结构struct{}
。
这是Go中最小的构建块。它的大小字面上是0字节。
如果大小为零。你可以创建一个1000个空结构的切片,这个切片将非常小。因为真正的Go只在切片中存储了一些但不是它们本身。与渠道相同的故事。
指向它的所有指针始终指向内存中相同的特殊位置。
非常有用在通道中,当您通知某些事件但不需要传递任何有关它的信息时,只有一个事实。最好的解决方案是传递一个空结构,因为它只会增加通道中的计数器,但不会分配内存,复制元素等等。 有时人们会为此目的使用布尔值,但情况要糟糕得多。
方法的零大小容器。你可能想要一个模拟测试接口。通常你不需要数据,只需要预定义输入和输出的方法。
Go没有Set
个对象。位可以很容易地实现为map[keyType]struct{}
。这种方式映射只保留键和没有值。
答案 1 :(得分:3)
我通常在需要使用布尔值通道的地方使用它。 即,而不是;
func main() {
done := make(chan bool, 1)
go func() {
// simulate long running task
time.Sleep(4 * time.Second)
done <- true
fmt.Println("long running task is done")
}()
<-done
close(done)
fmt.Printf("whole program is done.")
}
我用;
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan struct{}, 1)
go func() {
// simulate long running task
time.Sleep(4 * time.Second)
done <- struct{}{}
fmt.Println("long running task is done")
}()
<-done
close(done)
fmt.Printf("whole program is done.")
}