2014-10-18 66 views
2

這是我帶Go的第一週,所以請原諒無知;)。我從Python中安然無恙。我正在構建一個簡單的帶有加法和減法的計算器。如何動態遍歷一個包?

addition.go文件看起來像這樣:

package calculator 

type Add struct{} 

func (h Add) First(x int) int { 
    x += 5 
    return x 
} 

func (h Add) Second(x int) int { 
    x += 10 
    return x 
} 

subtraction.go文件的佈局看起來非常相似,addition.go和未來的功能,如multiplication.godivision.go將類似於。要運行這些我:

package main 

import (
    "fmt" 
    "github.com/mytester/calculator" 
) 

type Calc interface { 
    First(x int) int 
    Second(x int) int 
} 

func main() { 
    x := 10 
    var i Calc 
    a := &calculator.Add{} 
    i = a 
    i.First(x) 
    fmt.Println(x) 
    fmt.Println(i.First(x)) 
    fmt.Println(i.Second(x)) 

    fmt.Println("Next method...") 
    b := &calculator.Sub{} 
    i = b 
    fmt.Println(x) 
    fmt.Println(i.First(x)) 
    fmt.Println(i.Second(x)) 

    // iterate through the rest of my calculator methods 

} 

這似乎很繁瑣,特別是我添加越來越多的功能,如乘法,等有沒有辦法找到我的計算器的所有方法&然後遍歷所有的人?我已經瀏覽了reflect文檔,但似乎沒有辦法解決這個問題。它們的運行順序無關緊要。例如,減法可以在添加之前運行。

回答

5

Go不提供您想要的功能。沒有機制來反思包的內容。原因是編譯器只保留可執行文件中引用的函數和變量。如果你從不顯式使用函數,它將不在可執行文件中。遍歷一組可能不完整的符號是沒有意義的,因此沒有實現。

您可以創建一個包含您想要操作的類型的對象的數組,並對其進行迭代,以解決您的問題。