如何动态迭代包?

时间:2014-10-18 20:54:18

标签: go

这是我与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文档,但似乎没有办法解决这个问题。它们运行的​​顺序并不重要......例如减法可以在加法之前运行。

1 个答案:

答案 0 :(得分:5)

Go不提供您想要的功能。没有机制来反省包的内容。这样做的原因是编译器只保留可执行文件中的函数和变量。如果您从未明确使用过某个函数,那么它将不在可执行文件中。迭代一组可能不完整的符号是没有意义的,因此没有实现。

你可以创建一个包含你想要操作的类型的对象的数组,如果能解决你的问题,就可以迭代它。