Rumah > pembangunan bahagian belakang > Golang > Structs Tanpa Nama lwn. Structs Kosong dalam Go: Mengapa Menggunakan `struct{}` untuk Penyegerakan Goroutine?

Structs Tanpa Nama lwn. Structs Kosong dalam Go: Mengapa Menggunakan `struct{}` untuk Penyegerakan Goroutine?

DDD
Lepaskan: 2025-01-04 05:10:39
asal
832 orang telah melayarinya

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

Struct Tanpa Nama lwn. Struct Kosong dalam Go

Pertimbangkan coretan kod berikut, yang menggunakan saluran jenis struct{} untuk memudahkan komunikasi antara gorouti:

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 }
}
Salin selepas log masuk

[Soalan 1]

Barisan selesai <- struct{}{}, yang menghantar struct kosong ke saluran selesai, telah mencetuskan kekeliruan. Walaupun struct biasa boleh diisytiharkan dengan struct { /* medan */ }, struct kosong dilambangkan dengan struct{}{}, yang menggesa beberapa soalan:

  • Mengapa sintaks ini diperlukan?
  • Adakah ini struct tanpa nama atau struct kosong?

An struktur kosong ialah struct yang tidak mempunyai sebarang medan. Ia juga dikenali sebagai struktur tanpa nama. Tujuan struct kosong adalah untuk menyediakan cara untuk mencipta jenis yang tidak mempunyai medan, yang boleh berguna untuk pelbagai sebab, seperti:

  • Sebagai pemegang tempat untuk jenis yang boleh ditambah pada masa hadapan
  • Sebagai cara untuk mencipta jenis unik yang boleh digunakan untuk penyegerakan
  • Sebagai cara untuk mencipta jenis yang boleh digunakan sebagai kunci dalam peta

Dalam kod kami, kami menggunakan struct tanpa nama untuk menandakan bahawa goroutine telah menyelesaikan kerjanya. Menggunakan struct kosong untuk tujuan ini adalah berfaedah kerana ia mempunyai saiz 0, meminimumkan jejak memori.

[Soalan 2]

Garis untuk _ = range langs { <-done } bertanggungjawab untuk menerima dan membuang nilai daripada saluran selesai. Baris ini diperlukan atas sebab-sebab berikut:

  • Tanpa talian ini, program tidak akan menghasilkan sebarang output kerana goroutine utama akan keluar sebelum goroutine lain selesai kerjanya.
  • Gelung menerima nilai daripada saluran selesai, tetapi membuangnya menggunakan pembolehubah _ kad bebas. Ini kerana kami tidak berminat dengan nilai sebenar yang dihantar oleh goroutine. Kami hanya mahu menunggu sehingga semua gorouti memberi isyarat siap.

Dengan menggunakan saluran jenis struct{} dan struct kosong sebagai mekanisme isyarat, kita boleh mencapai komunikasi yang cekap antara gorouti dengan overhed minimum .

Atas ialah kandungan terperinci Structs Tanpa Nama lwn. Structs Kosong dalam Go: Mengapa Menggunakan `struct{}` untuk Penyegerakan Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan