Go语言学习重点

2018-08-03 15:40:09 1064

    近年来多核化和集群化正在成为了互联网时代发展的典型特征,Go语言的设计者们宣称对C、C++、java、C#、Delphi,乃至于PHP、Python、Perl、Ruby等语言感到深深的沮丧,他们要创造一门新的编程语言来满足分布式和并行计算的要求,事实也证明现在国内许多互联网公司在编写大并发高效处理的服务业务首选Go作为开发语言。对于C、C++、java和C#开发工程师来说,学习Go会非常轻松,特别是抓住下面的知识点,上手是分分钟的事情。

  • 并发编程模型分为两个流派:共享内存流派和消息传递流派,gotoutine和channel构成go语言的基础,虽然go语言支持共享内存,但还是忘记它吧,只有channel才能把gotoutine的性能发挥到极致;
  • go语言是强制统一代码风格的编程语言,首字母大写的变量、函数和方法等同于公有属性为包外可见,否则为对象私有包外不可见,变量函数命名规则主流有骆驼命名法(JAVA和C#)和下划线法(C),强烈建议骆驼法,左花括号必须位于行尾否则编译不给过,如果不能改变就不要吐槽go的编码风格;
  • go语言支持函数多返回值,如:f, err := os.Open(filename),不关心可以使用占位符表示,如:f, _ := os.Open(filename),免去传递一大堆引用参数或封装结构体和对象的尴尬,越用越喜欢的语言特性;
  • defer关键字含义为无论函数执行是否异常,均在函数退出前自动执行,且执行的顺序为先进后出,用法例如:创建连接defer连接、打开句柄defer句柄、打开结果集defer结果集;
  • go语言反对函数和操作符重载、反对继承、虚函数,但并不代表go语言不能实现上述功能,可以通过组合方式变现,go语言同时放弃了对象的构造和析构等OOP特性,接口(interface)的非侵入性是其与其他面向对象语言最大的区别,go语言在面向对象的编程思想上真正做到了取C++、JAVA精髓而又去其糟粕;
  • go数据分为数值语义和引用语义,其中数组是数值语义,切片和字典(二者与channel一样均为引用语义)作为内置的数据类型,支持接口、闭包和匿名函数、支持反射、支持自动垃圾回收,充分体现了go语言的先进性;
  • go语言定义一个接口并声明一个接口变量,new一个对象赋值给接口变量从而实现接口与类型的直接转换,松散低耦合的对应关系大大降低接口调整导致的代码变动量,优势谁用谁知道;
  • Cgo功能提供C与go语言的交互,相比JNI简单易用多了,几行注释轻轻松松实现集成和调用真是省心省力;
  • 采用gdb对go程序调试与C没有特别的不同,调试信息的格式为DWARFv3,gdb的版本需高于7.1,C\C++开发工程师表示毫无压力;
  • go语言的位运算符取反操作为^x,与其他语言~x的写法不同,时时刻刻提醒go就是go,是颜色不一样的烟火,天空海阔,要做最坚强的泡沫~
  • go语言switch的case可以是值也可以是表达式如:0 <= num && num <= 3,也可以如case 1, 2, 3多个值,且语句下不用接break,关键字fallthrough表示执行完当前case后继续执行下面的case,C\C++和java表示无可奈何;
  • go语言循环语句关键字为for,支持foreach风格(for idx, arg := range args),但不支持while和do-while,类似while(1)和while(true)之类的代码不会再出现了;
  • 函数func myfunc(args ...int)表示入参个数不确定,原样传参:myfunc1(args...),传片段:myfunc2(args[1:]...),表示把args片段从下标1到结尾打散传输,不确定类型的如:func myfunc3(args ...interface{});
  • 匿名函数:func(ch chan int) {ch <- ACK} (reply_chan),形参ch是一个int类型的channel,大括号是函数体,reply_chan为实参表示实际调用,f := func(x, y int) int {return x + y}表示将匿名函数赋值给函数对象变量f,开始别扭习惯就好了;
  • go语言函数是函数,方法是方法,函数是一段代码片段,方法是指定了函数的接收者;方法:func (a *Integer) Add(b Integer)指出其接收者为Integer对象的指针类型,func (a Integer) Add(b Integer)为对象的值类型,区别在于对接收者a的操作结果,此外,go语言编译器可以根据值语义的接收者方法自动生成引用语义的接收者方法,没读懂请再读一遍;
  • go语言支持接口查询功能,例如:if file, ok := file1.(two.IStream); ok {...},其中file1为某接口变量,two.IStream为某包下的某接口定义,判断ok值后调用接口中的方法可以避免不必要的异常;
  • go语言采用select判断句柄状态,每个case必须是一个IO操作,超时控制首先异步sleep指定时间,然后向超时chan里写入值,在select下的case里可读出意味超时,go语言没有提供直接的超时处理机制,这种变通的实现方法总觉得设计者高深莫测有所保留;
  • 单向channel机制,例如:var ch1 chan<- float64,表示ch1是单向channel,只用于写入float64数据,再例如:var ch2 <-chan int,表示ch2是单向channel,只用于读取int数据,channel之间可以相互转换,把chan单向强制类型转换成双向go不禁止但这么做要对得起自己的良心;
  • sync.Once(函数名)用于全局初始化操作,sync.atomic子包提供一系列原子操作的函数,各种语言分别有对应的方法,列出来加深记忆;
  • type Person struct {

             Name string "name"

             Mail string "mail"

        }为每个字段增加tag以便通过反射机制获取成员变量,以及用于标注序列化字段的名称;

  • 一份赏心悦目的代码可以提高工作效率,如果不知道怎么空格怎么缩进怎么换行可以执行命令go fmt 源文件.go,学习一下以后就这样写代码吧;

    开发工具强烈建议JetBrains,风格一如IDEA,Go语言汲取了众多语言的优点,但更简单更精炼,值得花些时间研究,因为它老爸叫谷歌。

编程语言 函数 c++ 面向对象 c# 并行计算 数据类型 位运算

作者

厉力文武
TA的文章

相关文章