【问题标题】:Data type that accepts multiple interface type接受多种接口类型的数据类型
【发布时间】:2020-08-10 17:00:24
【问题描述】:

我会尽力在这里解释我的情况。

所以,我正在为我的应用创建一个 DAL。它同时访问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
}

现在我需要实现一个 DBClient Factory,它维护一个 dbtype 和客户端的映射。 是这样的

文件 DBClientFactory.go

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

问题是如何在一张地图中容纳不同类型的客户? 我想定义另一个接口DBFactory,其中嵌入了另外两个接口。但这显然行不通,因为所有方法都不是由单个接口实现的。

我应该如何解决这个问题?

【问题讨论】:

    标签: dictionary go interface


    【解决方案1】:

    您可以将interface{} 用于映射值类型,但这样会失去类型安全性,并且必须使用类型断言或类型切换。

    相反,您应该使用 2 种不同的地图类型,一种用于您要存储的每个界面:

    type DBClientfactory struct {
        nosqldbs map[string]NosqlDb
        sqldbs   map[string]SqlDB
    }
    

    每个函数或方法都会使用适当的映射,GetNoSqlDBClient() 会使用DBClientfactory.nosqldbsGetSqlDBClient() 会使用DBClientfactory.sqldbs

    如果每个客户端只有一个实例,那么根本不要使用地图,只需使用简单的字段:

    type DBClientfactory struct {
        nosqldb NosqlDb
        sqldb   SqlDB
    }
    

    【讨论】:

    • 是的,但这完全消除了地图的使用。如果我在工厂结构中保留不同的字段,我不会保留地图,这些字段本质上是地图的键。
    • @AyushGoyal 如果每种类型只有一个实例,则根本不要使用地图。在这里使用地图不是一个好主意。
    • @AyushGoyal 无论如何,你的 getter 的实现要么毫无意义,要么不完整,如果你只是每次都用硬编码的键覆盖它的值,而从不实际读取它,那么地图的目的是什么。
    • 这是一个解释问题症结的简短示例。然而,实际的 getter 是不同的和完整的,从某种意义上说,它们利用了这些值。对于单个客户端,地图的键可以是不同类型的,所以是的,我可能需要也可能不需要覆盖值
    • @AyushGoyal 如果你想避免两张地图,你可以使用这样的东西:play.golang.com/p/in8EiFLNaJ-
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2016-01-25
    • 2012-03-25
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2012-09-23
    • 2017-08-28
    相关资源
    最近更新 更多