首頁 > 後端開發 > Golang > Go 中的匿名結構與空結構:為什麼要用 struct{} 進行 Goroutine 同步?

Go 中的匿名結構與空結構:為什麼要用 struct{} 進行 Goroutine 同步?

DDD
發布: 2025-01-04 05:10:39
原創
832 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板