2015-03-31 59 views
2

假設我有實現接口Reader項目的數組:遍歷實現接口的物品陣列

var items []Foo 

我將如何通過這些物品放進一個接受讀者的功能?

func (items []Reader) { ... } 

,因爲我得到一個錯誤,就像我不能使用類型[]Reader

Cannot use type `[]Foo` as type `[]Reader`... 
+0

請參閱https://golang.org/doc/faq#convert_slice_of_interface(並在讀取時將'io.Reader'替換爲'interface {}')。 – 2015-03-31 20:17:01

回答

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) 
} 
+0

這有效,但它意味着我必須在調用該函數之前遍歷所有項目。我試圖避免循環。 – 2015-03-31 22:55:14

+2

@ VladtheImpala:因爲它們在內存中沒有相同的表示形式,所以需要單獨複製這些元素。 ['我可以將[] T轉換爲[] interface {}?](https://golang.org/doc/faq#convert_slice_of_interface) – peterSO 2015-03-31 23:05:36

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()) 
}