golang的一些体会

 

1. 接口变量肯定对应一种具体类型,参考java的接口与实现。

2. 如果使用接口类型变量存储对象,那内存里会存两份内容:实际类型、接口类型(含接口中的函数指针列表)。

    - 其实这里的函数指针列表类似于C++的虚函数表。

    - 因为go的鸭子类型,所以接口变量必须记录接口中函数在对象的实现,否则无法找到,或者查询太慢。

3. gin 开发web项目超级简单,前提是懂HTTP协议。 一个有意思的是支持一个进程占用多个端口,这个是之前没有想过的。

4. grpc + protobuf + interceptor + lb 已经具备了微服务的一些基本功能。

5. etcd v3 已经与 v2完全不一样了,v2还是zk、redis的思路,v3则把租约单独抽取出来,并取消了目录格式(虽然表现上还是支持),还有watch不像zk那么弱(zk的通知不含数据,需要主动查询,期间可以漏掉中间的变动,或者存在不一致的情况)。

6. go-zero 开发微服务的确方便,提供命令和goland插件,基于pb一键生成代码,清晰易懂。插件丰富。嗯嗯,目前还没搞定既发布服务也订阅服务的情况,有时间研究下。

7. dubbo-go 也不错,提供了专门的命令。

8. 在某些方面上,go非常接近C和linux,如 os.Signal、exec等。

9. go的error是接口,对象可以是直接错误类型( errors.New("直接错误") ),也可以是封装错误类型( fmt.Errorf("我是封装的!%w", err) ),后者其实是一棵树。

    - 因为存在封装,所以有时候error不能直接使用 == 来判断,需要使用 errros.Is 来判断。

    - 因为存在封装,所以可以使用 errors.As 来提取指定类型的错误。

10. 直接提供了操作切片的slices工具包,这个是新增的吧? 非常有用!比如压缩Compact、清理冗余空间Clip、判等Equal、追加Concat、逆向Reverse、插入Insert、排序Sort、二分查找等。

11. reflect分为两块,Type和Value。

    - Type可以获取更底层的Kind(),比如别名时  type IA int32; type IB int32;,它们的Type肯定不一样,但Kind一样。

    - Value又分为可操作和不可操作的(指针类型可操作,其他类型因为是值传递导致无法修改原值),可操作的需要Elem才能操作。另外,还提供了CanXxx用于判断是否支持设置相应类型的数值。

12. 新版本 for 的变量每次都是新分配的空间,所以现在不会出现因为循环变量导致的闭包问题了。(为了兼容老版本,建议还是写 fun(x){}(x) 这种)

13. struct可以直接==比较 -- 无论是直接创建的还是new出来的(当然new的需要解引用一下,否则就成了指针判等)

14. go协程其实无所谓父子协程,所以也不存在捕获子协程的异常一说。不像父子进程、线程。

15. 因为14,所以只能在当前协程里捕获异常。

 

posted on 2024-07-15 11:49  LarryZeal  阅读(2)  评论(0编辑  收藏  举报

导航