Go 中與類型無關的通道
Go 中的通道是一種強大的通訊機制,允許 goroutine 發送和接收資料。在大多數情況下,通道用於傳遞特定類型的值。但是,可以建立可以接受多種不同類型的通道。
考慮以下範例:
<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 interface{} 類型的通道,它可以接受任何值的類型。當goroutine接收到通道上的值時,它會使用反射來確定該值的類型並將其列印出來。
也可以使用類型開關來處理通道上不同類型的值,如圖所示下面:
<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中文網其他相關文章!