將介面切片傳遞給Go 中不同的相容介面
在Go 中使用介面時,您可能會遇到需要的情況將一個介面的切片傳遞給需要不同介面切片的函數,儘管第一個介麵包括第二個介面。
考慮以下範例:
<code class="go">type A interface { Close() error Read(b []byte) (int, error) } type Impl struct {} func (I Impl) Read(b []byte) (int, error) { fmt.Println("In read!") return 10, nil } func (I Impl) Close() error { fmt.Println("I am here!") return nil } func single(r io.Reader) { fmt.Println("in single") } func slice(r []io.Reader) { fmt.Println("in slice") } im := &Impl{} single(im) // works list := []A{im} slice(list) // fails: cannot use list (type []A) as type []io.Reader</code>
在傳遞將A 類型的單項傳遞給具有介面參數io.Reader 的函數single 會成功,嘗試將A 的切片傳遞給需要io.Reader 切片的函數切片會失敗。
解:
不幸的是,這個問題是 Go 中的限制。要解決此問題,您必須建立所需介面類型的新切片,並使用現有切片中的元素填充它。
<code class="go">newList := make([]io.Reader, len(list)) for i, elem := range list { newList[i] = elem } slice(newList) // now works</code>
以上是如何將一個介面的切片傳遞給需要 Go 中不同的相容介面切片的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!