首页 > 后端开发 > Golang > Go 中的匿名结构与空结构:为什么使用 struct{} 进行 Goroutine 同步?

Go 中的匿名结构与空结构:为什么使用 struct{} 进行 Goroutine 同步?

DDD
发布: 2025-01-04 05:10:39
原创
830 人浏览过

Anonymous Structs vs. Empty Structs in Go: Why Use `struct{}` for Goroutine Synchronization?

Go 中的匿名结构与空结构

考虑以下代码片段,它使用 struct{} 类型的通道来促进 goroutine 之间的通信:

package main

import "fmt"

var battle = make(chan string)

func warrior(name string, done chan struct{}) {
    select {
    case opponent := <-battle:
        fmt.Printf("%s beat %s\n", name, opponent)
    case battle <- name:
        // I lost :-(
    }
    done <- struct{}{}
}

func main() {
    done := make(chan struct{})
    langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"}
    for _, l := range langs { go warrior(l, done) }
    for _ = range langs { <-done }
}
登录后复制

[问题1]

done

  • 为什么需要这种语法?
  • 这是一个匿名结构还是一个空结构?

一个空结构struct 是一个没有任何字段的结构体。它也称为匿名结构。空结构体的目的是提供一种创建没有字段的类型的方法,这对于各种原因都很有用,例如:

  • 作为可能添加的类型的占位符将来
  • 作为创建可用于同步的唯一类型的方法
  • 作为创建可用作键的类型的方法地图

在我们的代码中,我们使用匿名结构来表示 Goroutine 已完成其工作。为此目的使用空结构体是有利的,因为它的大小为 0,可以最大限度地减少内存占用。

[问题 2]

_ = range langs 的行{

  • 如果没有这行代码,程序将不会产生任何输出,因为主 Goroutine 将在其他 Goroutine 完成工作之前退出。
  • 该循环从完成通道接收值,但使用 _ 通配符变量丢弃它们。这是因为我们对 goroutine 发送的实际值不感兴趣。我们只想等待所有 goroutine 发出完成信号。

通过使用 struct{} 类型的通道和空结构体作为信号机制,我们可以以最小的开销实现 goroutine 之间的高效通信.

以上是Go 中的匿名结构与空结构:为什么使用 struct{} 进行 Goroutine 同步?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板