2014-02-25 61 views
1

我已經轉到下面的代碼的集合(片):通用方法循環結構

type Foo struct { Id int } 
type Bar struct { Id int } 

func getIdsFoo(foos []Foo) { 
    ids = make([]int, len(foos)) 
    // iterate and get all ids to ids array 
} 

func getIdsBar(bars []Bar) { 
    ids = make([]int, len(bars)) 
    // iterate and get all ids to ids array 
} 

有一個聰明的方法來創建一個功能getIds([]Idable)能接受有方法GetId()實現的任何結構?

回答

0

sort使用可能會幫助你的設計模式。

創建一個切片狀接口上工作的功能。然後根據您具體類型的一部分創建新類型。

希望的代碼比我的描述更加清楚。 http://play.golang.org/p/TL6yxZZUWT

type IdGetter interface { 
    GetId(i int) int 
    Len() int 
} 

func GetIds(ig IdGetter) []int { 
    ids := make([]int, ig.Len()) 
    for i := range ids { 
     ids[i] = ig.GetId(i) 
    } 
    return ids 
} 

type Foo struct{ Id int } 

type Bar struct{ Id int } 

type FooIdGetter []Foo 

func (f FooIdGetter) GetId(i int) int { 
    return f[i].Id 
} 

func (f FooIdGetter) Len() int { 
    return len(f) 
} 

type BarIdGetter []Bar 

func (b BarIdGetter) GetId(i int) int { 
    return b[i].Id 
} 

func (b BarIdGetter) Len() int { 
    return len(b) 
} 

func main() { 
    var f = []Foo{{5}, {6}, {7}} 
    var b = []Bar{{10}, {11}, {12}} 

    fmt.Println("foo ids:", GetIds(FooIdGetter(f))) 
    fmt.Println("bar ids:", GetIds(BarIdGetter(b))) 
} 

還有更多的樣板比是愉快的,(去仿製藥......一天)。最大的優點是無需將新方法添加到Foo,Bar或您可能需要處理的任何未來類型中。

+0

爲什麼downvote?它是一個完美的安納塞爾。只是認爲我需要的是編寫生成器,它會工作:)是否有任何使用嵌入的可能性,以避免一遍又一遍地生成'Len()'和'GetId()? –

3
type Identifiable interface { 
    GetId() int 
} 

func GatherIds(ys []Identifiable) []int { 
    xs := make([]int, 0, len(ys)) 
    for _, i := range ys { 
     xs = append(xs, i.GetId()) 
    } 
    return xs 
} 
+0

'[] Foo'不能轉換到'[] Identifiable',即使'Foo'實現'Identifiable'接口。 –

+0

錯字:'append(xs,i)'=>'append(xs,i.GetId())' –

+0

謝謝,我在手機上寫了這個。 – thwd