我想在 Go 中执行以下操作,其中c/c.go
包含:
package c
import (
a "github.com/.../a"
b "github.com/.../b"
)
func CallHandler(pkgName string) (err error) {
pkg, err := DereferencePackage(pkgName)
...
method, err := GetMethod(pkg, "Handler")
if err != nil {
return err
}
return method()
}
...
{
err = CallHandler("a")
...
err = CallHandler("b")
...
}
a/a.go
包含:
package a
func Handler() (err error) {
// Do whatever
return err
}
并b/b.go
包含:
package b
func Handler() (err error) {
// Do whatever
return err
}
一个明显的解决方案是开关:
func CallHandler(pkgName string) (err error) {
switch pkgName {
case "a":
return a.Handler()
case "b":
return b.Handler()
default:
return fmt.Errorf("no handler defined for %s", pkgName)
}
}
但我想知道是否有可能更优雅地做到这一点,也许使用reflect
包。问同样问题的另一种方法是,包可以成为 Go 中的接口吗?