如何在结构中嵌入两个同名的类型?例如:
type datastore { *sql.Store *file.Store }
结果为duplicate field Store。我知道这是有道理的,因为你不能引用嵌入的字段ds.Store,但是你是如何做到这一点的呢?为了澄清,我想用datastore实现一个接口。为此,需要两个结构体,因为它们的方法可以相互补充以创建接口。我还有什么选择?
duplicate field Store
ds.Store
datastore
wi3ka0sx1#
使用类型别名,例如:
type SqlStore = sql.Store // this is a type alias type datastore struct { *SqlStore *file.Store }
类型别名不会创建与创建它的类型不同的新的非重复类型。它只是为sql.Store表示的类型引入了别名sqlStore,这是另一种拼写。
sql.Store
sqlStore
lf5gs5x22#
您可以尝试首先将whatever.Store Package 到不同名称的类型中:
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可能会支持类型别名:参见this和this。我不确定这对你的情况是否有帮助,但可能会很有趣。
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 }
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) }
这对我来说很好。
4条答案
按热度按时间wi3ka0sx1#
使用类型别名,例如:
类型别名不会创建与创建它的类型不同的新的非重复类型。它只是为
sql.Store
表示的类型引入了别名sqlStore
,这是另一种拼写。lf5gs5x22#
您可以尝试首先将
whatever.Store
Package 到不同名称的类型中:Playground link。
请注意,Go 1.9可能会支持类型别名:参见this和this。我不确定这对你的情况是否有帮助,但可能会很有趣。
ffscu2ro3#
您确实可以引用一个字段,即使它存在于两个不同的子结构中,作为匿名字段:
iq0todco4#
您可以简单地在结构中以不同的方式“命名”这两个“Store”。当你没有在结构中命名嵌入的结构字段时,它默认为嵌入结构的名称,所以,在这里,你有两个名为“Store”的字段,但是你可以很容易地使名称显式化。那就这样吧
这对我来说很好。