如何在结构中嵌入两种相同名称的类型?例如:
type datastore {
*sql.Store
*file.Store
}
duplicate field Store
中的结果。我知道这是有道理的,因为你不能引用嵌入式字段ds.Store
,但你怎么做到这一点呢?
为了澄清,我想实现一个datastore
的接口。因为这两种结构都是必需的,因为它们的方法相互补充以创建界面。我有什么改变?
答案 0 :(得分:4)
您可以尝试先将whatever.Store
打包成不同名称的类型:
import (
"os"
"whatever/sql"
)
type SqlStore struct {
*sql.Store
}
type FileStore struct {
*os.File
}
type DataStore struct {
SqlStore
FileStore
}
请注意,Go 1.9可能会获得类型别名的支持:请参阅this和this。我不确定这会对你的情况有所帮助,但可能有趣的了解。
答案 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
,这是备用拼写。