首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go中的结构原型设计

Go中的结构原型设计
EN

Stack Overflow用户
提问于 2015-09-01 22:16:15
回答 2查看 257关注 0票数 1

我的用例是,我需要在Go中有几个结构,他们将拥有相同签名的方法,而不一定要拥有所有的方法。下面的代码描述了需求,也代表了我当前的解决方案。

代码语言:javascript
复制
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中实现这一点的最好方法是什么?我可以使用接口实现更好的解决方案吗?

EN

回答 2

Stack Overflow用户

发布于 2015-09-01 22:25:11

使用接口。

代码语言:javascript
复制
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:由于您已经编辑了问题,下面是一个示例,说明如何使用断言和接口来为您的任务提供更广泛的接口:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2015-09-05 22:25:38

我亲自和一些人讨论过,显然我的解决方案是正确的。虽然它可以使用接口重写,但这并不一定是一种改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32333981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档