在结构中嵌入两个具有相同名称的结构

时间:2017-01-31 06:39:37

标签: inheritance go struct interface

如何在结构中嵌入两种相同名称的类型?例如:

type datastore {
    *sql.Store
    *file.Store
}

duplicate field Store中的结果。我知道这是有道理的,因为你不能引用嵌入式字段ds.Store,但你怎么做到这一点呢?

为了澄清,我想实现一个datastore的接口。因为这两种结构都是必需的,因为它们的方法相互补充以创建界面。我有什么改变?

3 个答案:

答案 0 :(得分:4)

您可以尝试先将whatever.Store打包成不同名称的类型:

import (
    "os"
    "whatever/sql"
)

type SqlStore struct {
    *sql.Store
}

type FileStore struct {
     *os.File
}

type DataStore struct {
     SqlStore
     FileStore
}

Playground link

请注意,Go 1.9可能会获得类型别名的支持:请参阅thisthis。我不确定这会对你的情况有所帮助,但可能有趣的了解。

答案 1 :(得分:2)

即使存在于包含为匿名字段的两个不同子结构中,您确实可以引用字段:

package main

import "fmt"

type A struct {
    x int32
}

type B struct {
    x int32
}

type C struct {
    A
    B
}

func main() {
    c := C{A{1}, B{2}}
    //fmt.Println(c.x) // Error, ambiguous
    fmt.Println(c.A.x) // Ok, 1
    fmt.Println(c.B.x) // Ok, 2
}

答案 2 :(得分:0)

使用type alias,例如:

type sqlStore = sql.Store // this is a type alias

type datastore {
    *sqlStore
    *file.Store
}

类型别名不会创建不同于其创建类型的新的独特类型。它只是为sqlStore表示的类型引入了别名sql.Store,这是备用拼写。