我可以在遗传上为Golang Struct指定一个方法吗?

时间:2014-09-29 19:26:33

标签: go go-interface

我一直在阅读the go-lang interface doc;但是我仍然不清楚是否有可能达到我想要的目标

type A struct {
    ID SomeSpecialType
}

type B struct {
    ID SomeSpecialType
}

func (a A) IDHexString() string {
    return a.ID.Hex()
}

func (b B) IDHexString() string {
    return b.ID.Hex()
}

这样可以正常工作;但是我更喜欢一些惯用的方法将常用方法应用于两种类型,并且只定义一次。喜欢的东西:

type A struct {
    ID SomeSpecialType
}

type B struct {
    ID SomeSpecialType
}

func (SPECIFY_TYPE_A_AND_B_HERE) IDHexString() string {
    return A_or_B.ID.Hex()
}

2 个答案:

答案 0 :(得分:4)

实际上你不能像以前那样习惯,但你可以做的是匿名继承一个超级结构(对不起它不是法律词语:P):

type A struct {

}

type B struct {
    A // Anonymous
}

func (A a) IDHexString() string {

}

B现在可以实施IDHexString方法。

这与许多其他语言类似:

class B extends A { ... }

答案 1 :(得分:3)

例如,使用合成,

package main

import "fmt"

type ID struct{}

func (id ID) Hex() string { return "ID.Hex" }

func (id ID) IDHexString() string {
    return id.Hex()
}

type A struct {
    ID
}

type B struct {
    ID
}

func main() {
    var (
        a A
        b B
    )
    fmt.Println(a.IDHexString())
    fmt.Println(b.IDHexString())
}

输出:

ID.Hex
ID.Hex