乐趣区

关于golang:goovn源码阅读思考

go-ovn 源码浏览思考

最近在学习 ovn 相干的内容,须要通过 go-ovn 库实现向 ovn 写入信息。
go-ovn 的源码实现大抵实现性能简略梳理一下:
go-ovn 代码的核心思想就是封装了 libovsdb 库,将 rpc 接口批改为了 api 接口,定义了 marshal unmarshal 的转换。而 libovsdb 则基于 RFC7047 协定实现了 RPC 接口的基本功能,包含单方通信的办法。

底层思维:

  1. 须要了解 ovsdb manager protocol 协定的内容,即协定中定义了操作的办法包含 update、notify 等等。
  2. 须要了解 ovsdb 表的内容便于了解 json 是如何转换的,对应的转换名称是什么。

学到内容:

json-rpc

json-rpc 通信 (来自百度百科):

https://baike.baidu.com/item/…

rpc 例子:

https://github.com/cenkalti/rpc2
https://github.com/neilliu989…

interface 实现小技巧

  1. 应用_ 变量提前裸露 struct 是否齐全实现 interface 所定义的函数.

    • 例如当咱们的接口有很多的定义方法时,如果不采纳强制裸露的形式,很难在第一工夫发现错误。
    • 代码中的 var _ Client = &ovndb{}, 目标是校验 ovndb struct 是否全副实现了 Client 接口的所有办法,否则编译报错。
  2. 如何保障 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 的定义

  1. 常常看到函数的返回值被定义了名称,此时能够间接应用此名称而不必在函数外部定义
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 中嵌入构造体的解答

    1. 函数定义应该晓得的几个内容

      • 函数毋庸前置申明
      • 不反对命名嵌套定义,反对匿名嵌套
      • 函数只能判断是否为 nil,不反对其它比拟操作
      • 反对多返回值
      • 反对命名返回值
      • 反对返回局部变量指针
      • 反对匿名函数和闭包

    本文链接:https://neilliu9891.github.io…

    退出移动版