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

时间:2017-11-29 02:37:17

标签: go

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

type FrontierSigner struct{}

有什么好处?

2 个答案:

答案 0 :(得分:17)

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

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

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

  3. 指向它的所有指针始终指向内存中相同的特殊位置。

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

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

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