go-ovn源码浏览思考
最近在学习ovn相干的内容,须要通过go-ovn库实现向ovn写入信息。
go-ovn的源码实现大抵实现性能简略梳理一下:
go-ovn 代码的核心思想就是封装了libovsdb库,将rpc接口批改为了api接口,定义了marshal unmarshal的转换。而libovsdb则基于RFC7047协定实现了RPC接口的基本功能,包含单方通信的办法。
底层思维:
- 须要了解ovsdb manager protocol协定的内容,即协定中定义了操作的办法包含update、notify等等。
- 须要了解ovsdb表的内容便于了解json是如何转换的,对应的转换名称是什么。
学到内容:
json-rpc
json-rpc通信(来自百度百科):
https://baike.baidu.com/item/...
rpc例子:
https://github.com/cenkalti/rpc2
https://github.com/neilliu989...
interface实现小技巧
应用_ 变量提前裸露struct是否齐全实现interface所定义的函数.
- 例如当咱们的接口有很多的定义方法时,如果不采纳强制裸露的形式,很难在第一工夫发现错误。
- 代码中的var _ Client = &ovndb{}, 目标是校验ovndb struct是否全副实现了Client接口的所有办法,否则编译报错。
- 如何保障struct不须要实现全副的interface办法,同样可能转换成Interface类型呢?将interface作为struct的匿名变量
type TestI1 interface { Test1() error}type TestS1 struct { TestI1}var t1 TestI1 = &TestS1{}func main() { fmt.Println("vim-go") fmt.Printf("%v\n", t1)}
golang 中function的定义
- 常常看到函数的返回值被定义了名称,此时能够间接应用此名称而不必在函数外部定义
func main() { r1, r2 := NameReturn() fmt.Printf("%s, %d\n", r1, r2)}func NameReturn() (r1 string, r2 int) { r1 = "r1" r2 = 2 return r1, r2}
https://www.jianshu.com/p/a5b... struct中嵌入构造体的解答
函数定义应该晓得的几个内容
- 函数毋庸前置申明
- 不反对命名嵌套定义,反对匿名嵌套
- 函数只能判断是否为nil,不反对其它比拟操作
- 反对多返回值
- 反对命名返回值
- 反对返回局部变量指针
- 反对匿名函数和闭包
本文链接: https://neilliu9891.github.io...