在Go中使用带有空结构的类型有什么用?

Nul*_*lik 5 go

为什么要创建一个空结构的类型?

type FrontierSigner struct{}
Run Code Online (Sandbox Code Playgroud)

到底有什么好处呢?

Eug*_*sky 20

struct{}在Go中以特殊方式实现空结构.

  1. 它是Go中最小的构建块.它的大小字面上是0字节.

  2. 如果是零大小.你可以创建一个1000个空结构的切片,这个切片将非常小.因为真正的Go只在切片中存储了一些但不是它们本身.与渠道相同的故事.

  3. 所有指向它的指针总是指向内存中的同一个特殊位置.

  4. 非常有用在通道中,当您通知某些事件但不需要传递任何有关它的信息时,只有一个事实.最好的解决方案是传递一个空结构,因为它只会增加通道中的计数器,但不会分配内存,复制元素等等.有时人们会为此目的使用布尔值,但情况要糟糕得多.

  5. 用于方法的零尺寸容器.你可能想要一个模拟测试接口.通常你不需要数据,只需要预定义输入和输出的方法.

  6. Go没有任何Set对象.位可以很容易地实现为map[keyType]struct{}.这种方式映射只保留键和没有值.


Kom*_*omu 7

我通常在我会使用布尔值通道的地方使用它。即,而不是;

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.")
}
Run Code Online (Sandbox Code Playgroud)

我用;

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.")
}
Run Code Online (Sandbox Code Playgroud)