我的用例是,我需要在Go中有几个结构,他们将拥有相同签名的方法,而不一定要拥有所有的方法。下面的代码描述了需求,也代表了我当前的解决方案。
type calc struct {
fn func(a, b int) int
gn func(a string) bool
name string
}
func add(a, b int) int {
return a + b
}
func bar(foo string) bool {
// do something
}
func sub(a, b int) int {
return a - b
}
func main() {
for c := range []calc{{
fn: add,
gn: bar,
name: "addition",
}, {
fn: sub,
name: "subtraction",
}} {
fmt.Printf("%s(10, 15) returned: %d\n", c.name, c.fn(10, 15))
if c.gn != nil {
c.gn(c.name)
}
}
}我的问题是如何改进这段代码?在Go中实现这一点的最好方法是什么?我可以使用接口实现更好的解决方案吗?
发布于 2015-09-01 22:25:11
使用接口。
type Op interface {
Name() string
Do(a, b int) int
}
type Add struct{}
func (Add) Name() string { return "add" }
func (Add) Do(a, b int) int { return a + b }
type Sub struct{}
func (Sub) Name() string { return "sub" }
func (Sub) Do(a, b int) int { return a - b }游乐场:http://play.golang.org/p/LjJt6D0hNF。
EDIT:由于您已经编辑了问题,下面是一个示例,说明如何使用断言和接口来为您的任务提供更广泛的接口:
type RevOp interface {
Op
ReverseDo(a, b int) int
}
// ...
func (Add) ReverseDo(a, b int) int { return a - b }
// ...
fmt.Printf("%s(10, 15) returned: %d\n", op.Name(), op.Do(10, 15))
if op, ok := op.(RevOp); ok {
fmt.Printf("reverse of %s(10, 15) returned: %d\n", op.Name(), op.ReverseDo(10, 15))
}游乐场:http://play.golang.org/p/MQ6LlPDcEi。
发布于 2015-09-05 22:25:38
我亲自和一些人讨论过,显然我的解决方案是正确的。虽然它可以使用接口重写,但这并不一定是一种改进。
https://stackoverflow.com/questions/32333981
复制相似问题