> 백엔드 개발 > Golang > Go의 익명 구조체와 빈 구조체: 고루틴 동기화에 `struct{}`를 사용하는 이유는 무엇입니까?

Go의 익명 구조체와 빈 구조체: 고루틴 동기화에 `struct{}`를 사용하는 이유는 무엇입니까?

DDD
풀어 주다: 2025-01-04 05:10:39
원래의
831명이 탐색했습니다.

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

Go의 익명 구조체와 빈 구조체 비교

고루틴 간의 통신을 용이하게 하기 위해 구조체 유형 채널을 사용하는 다음 코드 스니펫을 고려하세요.

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 채널로 보내는 done <- struct{}{} 줄은 혼란을 불러일으켰습니다. 일반 구조체는 struct { /* fields */ }로 선언할 수 있지만, 빈 구조체는 struct{}{}로 표시되며, 이는 몇 가지 질문을 촉발합니다:

  • 이 구문이 왜 필요한가요?
  • 이것은 익명 구조체입니까, 아니면 빈 구조체입니까?

비어 있습니다. struct는 필드가 없는 구조체입니다. 익명 구조체라고도 합니다. 빈 구조체의 목적은 필드가 없는 유형을 생성하는 방법을 제공하는 것입니다. 이는 다음과 같은 다양한 이유로 유용할 수 있습니다.

  • 추가할 수 있는 유형에 대한 자리 표시자 앞으로
  • 동기화에 사용할 수 있는 고유한 유형을 만드는 방법으로
  • 에서 키로 사용할 수 있는 유형을 만드는 방법으로 지도

우리 코드에서는 익명 구조체를 사용하여 고루틴이 작업을 완료했음을 알립니다. 이 목적으로 빈 구조체를 사용하는 것은 크기가 0이고 메모리 사용 공간이 최소화되므로 유리합니다.

[질문 2]

_ = 범위 langs에 대한 줄 {

  • 이 줄이 없으면 다른 고루틴이 작업을 완료하기 전에 기본 고루틴이 종료되므로 프로그램은 어떤 출력도 생성하지 않습니다.
  • 루프는 완료 채널에서 값을 받지만 _ 와일드카드 변수를 사용하여 해당 값을 삭제합니다. 이는 고루틴이 보낸 실제 값에는 관심이 없기 때문입니다. 우리는 모든 고루틴이 완료 신호를 보낼 때까지 기다리고 싶습니다.

구조체{} 유형의 채널과 빈 구조체를 신호 메커니즘으로 사용하여 최소한의 오버헤드로 고루틴 간의 효율적인 통신을 달성할 수 있습니다. .

위 내용은 Go의 익명 구조체와 빈 구조체: 고루틴 동기화에 `struct{}`를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿