首頁 > 後端開發 > Golang > 主體

如何建立可以接受多種不同類型值的 Go 頻道?

Linda Hamilton
發布: 2024-11-04 03:08:02
原創
792 人瀏覽過

How can I create Go channels that can accept values of multiple different types?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!