算是正式开始学习go语言,早之前工作中几次接触到go,只是能大概看懂这块代码是实现什么功能和做些局部性的小改动(在借助于查资料的情况下)来满足业务需求,但是没有花时间去系统的学习下。一方面是,现在好多不错的开源实现也是使用go来开发的,可以学习下,比如知名的tidb,ethereum,及公司内部的一些开源实现和微服务相关,另一方面,好多岗位都招go或者C/C++/go这样的组合,算当作以后求职的一个技能点。
因为之前一直是C/C++/Lua/Nodejs这些,好像每份工作中使用到的开发语言都不同,总体感觉Lua/Nodejs虽然使用上方便,业务开发较容易上手,但因为有些错误只能在运行时才发现,比如变量abl写成ab1这样的,未定义的变量也不会报错;所以作为服务器开发来说,稳定和正确是最重要的。
对于Nodejs,使用上真的挺方便的,很多库不需要重新造轮子,当时分析socket.io/superagent相关源码来满足业务上的需求,有些功能虽然被官方实现或者集成到语言中,没有太多的机会从零设计踩坑,网上还是有很多原理性的分析可以参考。
这几天简单的了解/学习go的基础语法,执行流程,后续会深入学习它的更高特性比如协程,闭包,热更,socket等相关,及开发过程中的debug,性能分析及内存问题排查的使用。目前只是基本学习,还是要再深入基础。
在学习go的过程中,发现go的大部分特性跟其他语言差不多,比如变量命名,作用域,循环,表达式等,所表达的意思,虽然语法上不一样。所以我会在学习go的过程中,会潜意识中和C/C++对比下异同点。
不过初次学习和写一些demo还是有些不习惯,比如go中结构体type person struct,C/C++中 struct person这样,函数的返回值及形参声明相关;在学习到切片时,重点了解其实现原理和扩容机制,这里和C++中的vector思想类似,只不过前者扩容时在不同条件下扩容系数是不同的。
对于指针,不同的指针类型只是告诉编译器如何解释某块内存空间(即寻址范围),比如int *,在32位系统中,编译器读取这四个字节解释;struct *是一个结构体的地址范围,void *则不知道如何解释,所以需要强转类型。
至于引用,对于C++来说,其底层机制也是通过指针来实现的,而在go中,我目前还没学到(先记一下,后面再补充)。对于int/pointer等内建类型来说,传值和传引用区别不大;而像结构体这样的,传值则会引起(可能的潜)拷贝,且表明会在函数不会修改,因为是实参的副本,所以这里加不加const其实关系不大,对于要在函数中修改实参的,则需要加引用或者指针,这里说的是C++,可以参考《深度探索C++对象模型》(此书较老,且当时的C++版本应该是早于03)。go中应该不能使用const来修饰函数形参。(常量的值必须是能够在编译时就能够确定的,可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。)
还有很多后面再补...