英文:
Loop over array of items that implement an interface
问题
假设我有一个实现了接口Reader的项目数组:
var items []Foo
我该如何将这些项目传递给接受读取器的函数?
func myFunction(items []Reader) { ... }
我不能使用类型[]Reader,因为会出现以下错误:
无法将类型`[]Foo`用作类型`[]Reader`...
为了解决这个问题,你可以使用类型转换将[]Foo转换为[]Reader。你可以通过遍历items数组,并将每个元素转换为Reader类型,然后将它们添加到新的[]Reader数组中。下面是一个示例代码:
var readers []Reader
for _, item := range items {
    readers = append(readers, item)
}
myFunction(readers)
这样,你就可以将items数组中的元素传递给接受[]Reader类型参数的函数了。
英文:
Suppose I have an array of items that implement an interface Reader:
var items []Foo
How would I pass these items into a function that takes readers?
func (items []Reader) { ... }
I can't use the type []Reader because I get an error like:
Cannot use type `[]Foo` as type `[]Reader`...
答案1
得分: 2
例如,
package main
import (
	"bytes"
	"io"
)
var items []*bytes.Buffer
func f(items []io.Reader) {}
func main() {
	readers := make([]io.Reader, len(items))
	for i, item := range items {
		readers[i] = item
	}
	f(readers)
}
英文:
For example,
package main
import (
	"bytes"
	"io"
)
var items []*bytes.Buffer
func f(items []io.Reader) {}
func main() {
	readers := make([]io.Reader, len(items))
	for i, item := range items {
		readers[i] = item
	}
	f(readers)
}
答案2
得分: 1
与peterSO的答案类似。
package main
import (
    "bytes"
    "io"
)
type Foo struct{}
type Foos []Foo
func (f Foos) toReaders() []io.Reader {
    readers := make([]io.Reader, len(f))
    for i, item := range f {
        readers[i] = item
    }
    return readers
}
func f(items []io.Reader) {}
func main() {
    var x Foos
    f(x.toReaders())
}
与peterSO的答案类似。
英文:
Similar to peterSO's answer.
package main
import (
    "bytes"
    "io"
)
type Foo struct{}
type Foos []Foo
func (f Foos) toReaders() []io.Reader {
    readers := make([]io.Reader, len(f))
    for i, item := range f {
        readers[i] = item
    }
    return  readers
}
func f(items []io.Reader) {}
func main() {
    var x Foos
    f(x.toReaders())
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论