I'd like to do something like the following in Go, where c/c.go
contains:
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
contains:
package a
func Handler() (err error) {
// Do whatever
return err
}
and b/b.go
contains:
package b
func Handler() (err error) {
// Do whatever
return err
}
An obvious solution would be a switch:
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)
}
}
but I wondered if it's possible to do this a bit more elegantly, perhaps using the reflect
package. Another way to ask the same question is, can a package be an interface in Go?