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