Golang使用接口

时间:2015-08-07 19:58:58

标签: database go interface

抱歉有点虚假的问题,但我有点卡住了。

所以,我正在为我的应用程序实现数据库驱动程序之上的包装器,我需要尽可能保持它的可移植性。 我决定接口完全匹配这项任务。所以,我的数据库结构包含一些变量和特定于应用程序的方法,以及两个接口函数:

query(request string) error
flush() int? string?? struct?? slice????, error

现在你可能得到了一个主要问题。如何返回“flush()”类型不知道的数据?我可以通过界面返回它,如果可以的话,如何使用它?

第二个问题非常基本,但我还不清楚。 所以,我有这个数据库结构有两个方法,旨在由包用户实现使用他想要的数据库驱动程序。
何我写它以及未来的实现将如何看待(有一个关于go的示例,但它是关于使用类似方法的不同结构的接口)
希望你能帮助我找到一个理解:)

1 个答案:

答案 0 :(得分:0)

是的,冲洗只能有签名;

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 :\
}