Golang中国
e, err = engineFactory(nod, viper.GetViper())

传了2个变量,调了另外的一个包里面的方法。

// EngineFactory is a function that returns engine.Engine implementation.
type EngineFactory func(*node.Node, config.Getter) (engine.Engine, error)

// RegisterEngine allows to register custom Engine implementation.
func RegisterEngine(name string, fn EngineFactory) {
    EngineFactories[name] = fn
}

EngineFactory 只有一个声明,,实现呢。。。实现在哪里。。全局搜了没有找到!!!

这调的是哪啊。求解。。


631768417 于 2017-05-18 14:42 修改
11 回复
eric160
#1 eric160 • 2017-05-18 15:03

你即然能调用engineFactory,并且编译不出错的话,就说明这个函数有定义啊,再找找,你搜到的EngineFactory只是类型定义啊。

631768417
#2 631768417 • 2017-05-18 15:40

eric160 你好。是的。只是声明。可是没有实现。。我也很纳闷,编译通过的是。

eric160
#3 eric160 • 2017-05-18 16:05

你查找的时候区分大小写了么,查找engineFactory的实现。

还有一种情况就是例如:

var a EngineFactory
a=func(*node.Node, config.Getter) (engine.Engine, error){
...具体实现
}
engineFactory:=a
//或 var engineFactory EngineFactory=a

类似于这样的方式,再找找看,就是要找engineFactory变量的声明,即然能编译通过,就说明engineFactory作为函数或是变量已经定义过了。

631768417
#4 631768417 • 2017-05-18 16:10

这种真心是玩来玩去。。哎。。我再看看

631768417
#5 631768417 • 2017-05-18 16:11

另外再问个。golang的 map也有返回值???

`updates 是个 map[string]int64

val, ok := r.updates[uid]`
eric160
#6 eric160 • 2017-05-18 16:31

map类型存储的就是键值对,一个键对应一个值。
updates[uid]表示uid这个键对应的值
val, ok := r.updates[uid]
这种使用方式就是表示:
检查uid元素是否存在,如果存在就把uid键对应的值赋值给val,ok为true,如果不存在,val为空值,ok为false。
如果只想取值不用检查就可以写为:val:=r.updates[uid]

631768417
#7 631768417 • 2017-05-18 16:37

我猜的也是。。只是不确定。。谢谢了。。

631768417
#8 631768417 • 2017-05-18 17:09

我看完了 我的那个程序的关于这块的难点。。我感觉golang没有显式的指定实现了哪个接口类。。。

非常恶心。。。。。。

因为容易不清楚实现关系。。很恶心

631768417
#9 631768417 • 2017-05-18 17:10

有的导包是为了使用。有的导包是为了实现。。没有显式的implement。。 会导致结构不明确,阅读很麻烦。所以实现接口时候 一定要打好注释!!!

leronpror
#10 leronpror • 2017-05-19 17:25

type EngineFactory func(*node.Node, config.Getter) (engine.Engine, error)
这只是声明一个函数类型,为什么需要实现呢?就像 type MyInt int , 难道MyInt也需要实现?

leronpror
#11 leronpror • 2017-05-19 17:28

type EngineFactory func(*node.Node, config.Getter) (engine.Engine, error)
准确的说应该是定义一个新的类型,你还可以为这个新类型提供成员函数

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。