抱歉有点虚假的问题,但我有点卡住了。
所以,我正在为我的应用程序实现数据库驱动程序之上的包装器,我需要尽可能保持它的可移植性。 我决定接口完全匹配这项任务。所以,我的数据库结构包含一些变量和特定于应用程序的方法,以及两个接口函数:
query(request string) error
flush() int? string?? struct?? slice????, error
现在你可能得到了一个主要问题。如何返回“flush()”类型不知道的数据?我可以通过界面返回它,如果可以的话,如何使用它?
第二个问题非常基本,但我还不清楚。
所以,我有这个数据库结构有两个方法,旨在由包用户实现使用他想要的数据库驱动程序。
何我写它以及未来的实现将如何看待(有一个关于go的示例,但它是关于使用类似方法的不同结构的接口)
希望你能帮助我找到一个理解:)
答案 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 :\
}