如何在一个结构体中嵌入两种同名类型的变量?例如:
type datastore {
*sql.Store
*file.Store
}
出现duplicate field Store
的结果。我知道这是有道理的,因为您将无法引用嵌入字段ds.Store
,但您如何完成此操作呢?
澄清一下,我想要使用datastore
实现一个接口。为此,需要两个结构体,因为它们的方法互补以创建接口。我有什么其他选择吗?
如何在一个结构体中嵌入两种同名类型的变量?例如:
type datastore {
*sql.Store
*file.Store
}
出现duplicate field Store
的结果。我知道这是有道理的,因为您将无法引用嵌入字段ds.Store
,但您如何完成此操作呢?
澄清一下,我想要使用datastore
实现一个接口。为此,需要两个结构体,因为它们的方法互补以创建接口。我有什么其他选择吗?
type SqlStore = sql.Store // this is a type alias
type datastore struct {
*SqlStore
*file.Store
}
sqlStore
,作为 sql.Store
所表示类型的另一种拼写方式。whatever.Store
首先包装到不同命名的类型中:import (
"os"
"whatever/sql"
)
type SqlStore struct {
*sql.Store
}
type FileStore struct {
*os.File
}
type DataStore struct {
SqlStore
FileStore
}
Playground链接。在你的结构体中,你可以简单地给这两个“存储”命名不同的名称。当你在结构体中没有给一个嵌入式结构体字段命名时,默认使用嵌入式结构体的名称作为字段名。所以,在这里,你有两个名为“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)
}
即使在两个不同的子结构中作为匿名字段包含,您确实可以引用一个字段:
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
}