我會(huì)盡力在這里解釋我的情況。所以,我正在為我的應(yīng)用程序創(chuàng)建一個(gè) DAL。它同時(shí)訪問(wèn)redis和mysql。redis接口如下:文件 NoSqlDBClient.go:type NosqlDb interface { HGet() string}type NosqlClient struct { key string}func GetNosqlClient() *NosqlClient{ return &NosqlClient{}}func (ns *NosqlClient) HGet()string {//actual implemenation would be different return ns.key}文件 SqldbClient.go:type SqlDB interface { ExecQuery()}type SqlClient struct { query string}func GetsqlClient() *SqlClient{ return &SqlClient{}}func (s *SqlClient) ExecQuery()string { //actual implemenation would be different return s.query}現(xiàn)在我需要實(shí)現(xiàn)一個(gè) DBClient Factory,它維護(hù)一個(gè) dbtype 和客戶端的映射。它是這樣的文件 DBClientFactory.gotype DBClientfactory struct { clientmap[string] //what data type to use???}func GetNoSqlDBClient() NosqlDb{ client:=NoSqlDBClient.GetNosqlClient() clientmap['nosql'] = client return client}func GetSqlDBClient() SqlDB{ client:=SqlDBClient.GetsqlClient() clientmap['sql'] = client return client}問(wèn)題是如何在一張地圖中容納不同類型的客戶?我想定義另一個(gè)接口DBFactory,其中嵌入了其他兩個(gè)接口。但這顯然行不通,因?yàn)樗蟹椒ǘ疾皇怯蓡蝹€(gè)接口實(shí)現(xiàn)的。我該如何解決這個(gè)問(wèn)題?
1 回答

智慧大石
TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以使用interface{}map 值類型,但是您會(huì)失去類型安全性,并且必須使用類型斷言或類型切換。
相反,您應(yīng)該使用 2 種不同的地圖類型,一種用于您要存儲(chǔ)的每個(gè)接口:
type DBClientfactory struct {
nosqldbs map[string]NosqlDb
sqldbs map[string]SqlDB
}
并且每個(gè)函數(shù)或方法將使用適當(dāng)?shù)挠成?,GetNoSqlDBClient()將使用DBClientfactory.nosqldbs,GetSqlDBClient()并將使用DBClientfactory.sqldbs。
如果每個(gè)客戶端只有一個(gè)實(shí)例,則根本不要使用地圖,只需使用簡(jiǎn)單的字段:
type DBClientfactory struct {
nosqldb NosqlDb
sqldb SqlDB
}
- 1 回答
- 0 關(guān)注
- 156 瀏覽
添加回答
舉報(bào)
0/150
提交
取消