Go语言 在结构中嵌入两个同名的结构

mefy6pfw  于 2023-05-20  发布在  Go
关注(0)|答案(4)|浏览(148)

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

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

结果为duplicate field Store。我知道这是有道理的,因为你不能引用嵌入的字段ds.Store,但是你是如何做到这一点的呢?
为了澄清,我想用datastore实现一个接口。为此,需要两个结构体,因为它们的方法可以相互补充以创建接口。我还有什么选择?

wi3ka0sx

wi3ka0sx1#

使用类型别名,例如:

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

type datastore struct {
    *SqlStore
    *file.Store
}

类型别名不会创建与创建它的类型不同的新的非重复类型。它只是为sql.Store表示的类型引入了别名sqlStore,这是另一种拼写。

lf5gs5x2

lf5gs5x22#

您可以尝试首先将whatever.Store Package 到不同名称的类型中:

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。我不确定这对你的情况是否有帮助,但可能会很有趣。

ffscu2ro

ffscu2ro3#

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

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
}
iq0todco

iq0todco4#

您可以简单地在结构中以不同的方式“命名”这两个“Store”。当你没有在结构中命名嵌入的结构字段时,它默认为嵌入结构的名称,所以,在这里,你有两个名为“Store”的字段,但是你可以很容易地使名称显式化。那就这样吧

package main

import (
    "file"
    "fmt"
    "sql"
)

type Datastore struct {
    sqlStore  *sql.Store
    fileStore *file.Store
}

func main() {
    ds := Datastore{&sql.Store{SqlStoreName: "MySQLStore"}, &file.Store{FileStoreName: "MyFileStore"}}

    fmt.Println(ds.sqlStore.SqlStoreName, ds.fileStore.FileStoreName)
}

这对我来说很好。

相关问题