首頁  >  文章  >  後端開發  >  Go 的頻道類型是不可知的嗎?

Go 的頻道類型是不可知的嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-04 13:00:29566瀏覽

Is Go's Channel Type Agnostic?

Go 中類型不可知的通道

問題:

可以發送多種不同的資料型別在Go 中的單一通用通道上?

答案:

是的,這是可能的。使用 Playground 連結中提供的範例,可以使用以下語法建立通道:greet: make(chan pet);那麼,任何實現 pet 介面的類型都可以透過該通道無縫發送。

為了實現完全的型別不可知論,可以使用 chan interface{} 類型的通道。當從這樣的通道接收值時,可以使用反射來確定其類型。

示例:

演示此概念的簡化示例(儘管可能不慣用) :

<code class="go">ch := make(chan interface{})

go func() {
    select {
    case p := <-ch:
        fmt.Printf("Received a %q", reflect.TypeOf(p).Name())
    }
}()
ch <- "this is it"</code>

改進示例:

BurntSushi5 建議的替代方法使用型別開關:

<code class="go">p := <-ch
switch p := p.(type) {
case string:
    fmt.Printf("Got a string %q", p)
default:
    fmt.Printf("Type of p is %T. Value %v", p, p)
}</code>

以上是Go 的頻道類型是不可知的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn