고루틴 간의 통신을 용이하게 하기 위해 구조체 유형 채널을 사용하는 다음 코드 스니펫을 고려하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!