为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 使用接口实现数据库函数

Golang 使用接口实现数据库函数

Go
不负相思意 2021-11-01 10:28:35
对不起,有些愚蠢的问题,但我有点卡住了。所以,我正在为我的应用程序在数据库驱动程序之上实现包装器,我需要尽可能地保持它的可移植性。我决定接口非常适合这项任务。因此,我的数据库结构包含一些变量和特定于应用程序的方法,以及两个接口函数:query(request string) errorflush() int? string?? struct?? slice????, error现在你可能得到了主要问题。如何返回“flush()”类型不知道的数据?我可以通过接口返回它吗,如果可以,如何处理?第二个问题很基本,但我仍然不清楚。所以,我有这个数据库结构,它有两种方法,旨在由包用户实现以使用他想要的数据库驱动程序。我怎么写它以及未来的实现会是什么样子(有一个关于 go 之旅的例子,但它是关于具有类似方法的不同结构的接口)希望你能帮助我理解:)
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

是的,flush 就可以有签名;


flush() interface{}, error

你如何实施?像这样具有合理方法体的东西应该为你做;


type MyDbDriver struct {

     //fields

}


func (d *MyDbDriver) query(request string) error {

     return nil

}


func (d *MyDbDriver) flush() interface{}, error {

      return nil, nil

}

在 Go 中,所有接口实现都是隐式的,这意味着,如果您的类型具有与接口签名匹配的方法,那么您已经实现了它。不需要像public class MyType: IMyInterface, IThisIsntCSharp. 请注意,在上面的示例中*MyDbDriver已经实现了您的接口,但MyDbDriver还没有。


编辑:下面是一些伪调用代码;


e := driver.query("select * from thatTable where ThatProperty = 'ThatValue'")

if e != nil {

    return nil, e

}


i, err := driver.flush()

if err != nil {

     return nil, err

}


MyConcreteInstance := i.(MyConcreteType)

// note that this will panic if the type of i is not MyConcreteType

// that can be avoided with the familiar object, err calling syntax

MyConcreteIntance, ok := i.(MyConcreteType)

if !ok {

      // the type of i was not MyConcreteType :\

}



查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信