2

我一直在阅读go-lang 界面文档;但是我仍然不清楚是否有可能实现我想要的

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()
}
4

2 回答 2

4

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

type A struct {

}

type B struct {
    A // Anonymous
}

func (A a) IDHexString() string {

}

B现在将能够实现该IDHexString方法。

这就像在许多其他语言中一样:

class B extends A { ... }
于 2014-09-29T20:16:34.663 回答
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
于 2014-09-29T20:34:25.863 回答