如何在包中动态迭代

  • 本文关键字:动态 迭代 包中 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文档,但似乎没有办法得到它。它们的运行顺序无关紧要。。。。减法可以先于加法。

Go没有提供您想要的功能。没有对包内容进行内省的机制。原因是编译器只保留可执行文件中某个地方引用的函数和变量。如果您从未显式使用函数,那么它就不会出现在可执行文件中。对一组可能不完整的符号进行迭代是毫无意义的,因此没有实现。

您可以创建一个数组,其中包含您想要操作的类型的对象,并对其进行迭代(如果这解决了您的问题)。

最新更新