Go语言学习心得 | 青训营

76 阅读3分钟

最近一直在学习go语言,学习的时候也记录了一些笔记。我这个人之前是从来没有记录笔记的习惯,所以记得也不算很好,内容也不够完整,但是还是学到了不少东西。总的来说,Go 语言虽然是Google 推崇的静态编译类语言,但是它确实很有意思:

Go 与C语言有不少渊源,其实我一直认为C++太复杂,好像不伦不类的感觉……go 似乎在吸收其它语言的精髓上,真正继承和发扬了C语言,用极简的语法可以呈现复杂的变通。就是感觉设计原则简单又巧妙,但是实现的功能一个不少……

Golang 在语言层面对并发编程提供支持,一种类似协程,称作 goroutine 的东西,只需在函数调用语句前添加 go 关键字,就可创建并发执行单元。开发人员无需了解任何执行细节,调度器会自动将其安排到合适的系统线程上执行。  

goroutine 是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务。另有与之配套的 chan 类型,用以实现 "以通讯来共享内存" 的 CSP 模式,廉价的 goroutine 可以让我们美滋滋地处理异步任务,chan 可以用来交换数据, 这些简化了原本复杂的并发开发方式。

Go语言没有类和继承的概念,取而代之的是 struct、interface 和方法,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性,interface 的特性是 golang 支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,golang 提供了一种游离于类、继承、模板之外的另一种可靠的选择。

Java、javascript 这类是通过 try 块来包裹住会抛出异常的代码,catch 块来处理捕获的错误,而 go 语言就不一样了,是通过 panic 函数来抛出,而捕获则需要 defer +  recover, 不过这个 defer 不是 block 级别的,而是函数级别的,需要在函数返回前才得到执行。怎么说呢,这种机制不同于以上两种语言,各有各的特点,不过 golang 的就和 nodejs 以前的异步操作的回调函数一样,错误处理比较繁琐,需要对很多 err 进行判断。

Go 的并发……天生支持,这个channel真是省事,不用这个锁那个锁的,改变了开发并发程序的思路,用“管道”思想而不是传统的共享变量方法。

Go的网络编程,自带通用的库,所以实现web服务器,简单一两行代码就搞定,再加上并发的支持,对web后台服务是没问题,只不过前端还是JavaScript 的天下,go更适合代替c/c++成为系统语言,讲究性能的话就数它了。

golang 是比较容易上手,学习曲线也比较低,最好是有 c 或 c++ 基础,因为 golang 里面有指针之类的东西,有前两个的基础理解较为方便。还有对于运维来说,Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得很方便,不需要操心应用所需的各种包、库的依赖关系,减轻了维护的负担。