Go의 유형 독립적 채널
Go의 채널은 고루틴이 데이터를 보내고 받을 수 있게 해주는 강력한 통신 메커니즘입니다. 대부분의 경우 채널은 특정 유형의 값을 전달하는 데 사용됩니다. 그러나 여러 가지 다른 유형을 허용할 수 있는 채널을 생성하는 것은 가능합니다.
다음 예를 고려하세요.
<code class="go">package main import ( "fmt" "time" ) func main() { ch := make(chan interface{}) go func() { for { select { case p := <-ch: fmt.Printf("Received a %q\n", reflect.TypeOf(p).Name()) case <-time.After(time.Second): fmt.Println("Empty Loop") return } } }() ch <- "Hello" time.Sleep(time.Second) ch <- 123 time.Sleep(time.Second) ch <- struct{}{} time.Sleep(time.Second) ch <- []string{"Go", "programming"} time.Sleep(time.Second) }</code>
이 코드는 모든 유형을 허용할 수 있는 chan 인터페이스{} 유형의 채널을 생성합니다. 가치의 종류. 고루틴은 채널에서 값을 수신하면 리플렉션을 사용하여 값의 유형을 결정하고 인쇄합니다.
표시된 것처럼 유형 스위치를 사용하여 채널에서 다양한 유형의 값을 처리할 수도 있습니다. 아래:
<code class="go">package main import ( "fmt" "reflect" "time" ) func main() { ch := make(chan interface{}) go func() { for { select { case p := <-ch: switch p := p.(type) { case string: fmt.Printf("Got a string %q\n", p) case int: fmt.Printf("Got an int %d\n", p) case struct{}: fmt.Println("Got an empty struct") case []string: fmt.Printf("Got a slice of strings %+v\n", p) default: fmt.Printf("Type of p is %T. Value %v\n", p, p) } case <-time.After(time.Second): fmt.Println("Empty Loop") return } } }() ch <- "Hello" time.Sleep(time.Second) ch <- 123 time.Sleep(time.Second) ch <- struct{}{} time.Sleep(time.Second) ch <- []string{"Go", "programming"} time.Sleep(time.Second) }</code>
이 예는 유형 스위치를 사용하여 채널의 다양한 유형의 값을 처리하는 방법을 보여줍니다.
위 내용은 다양한 유형의 값을 수용할 수 있는 Go 채널을 어떻게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!