首頁 >後端開發 >Golang >如何將一個介面的切片傳遞給需要 Go 中不同的相容介面切片的函數?

如何將一個介面的切片傳遞給需要 Go 中不同的相容介面切片的函數?

Susan Sarandon
Susan Sarandon原創
2024-10-24 20:53:17555瀏覽

How to Pass a Slice of One Interface to a Function Expecting a Slice of a Different, Compatible Interface in Go?

將介面切片傳遞給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中文網其他相關文章!

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