在上家公司工作了两月余,将go学了个大概,最近转回java,特在此总结之前对于go的学习,不讨论细节问题,从宏观一点的角度来看待这门语言。
在这段时间的学习中,感触很深的就是:这可能是一个很优秀的语言,但是我感觉我始终是适应不了它,比较难驾驭,只能说能力有限。
go的一些特性
首先就吐吐槽吧,说一下不是很让人习惯的地方。
1、无分号;
结尾,这可能是被吐槽的很多的地方了,这个确实很奇葩。比如在声明数组的时候,如果在内部使用了换行,则最后一个元素末尾需要加,
,否则会报错。
var strArray [4]string = [4]string{
"there",
"must",
"be",
"comma",
}
2、包级别的函数访问,这个在微服务中或者小项目中其实还ok,但是稍微大一点的项目,找个函数真的是痛不欲生,特别是看GitHub这类的别人的源码时候。这个是因为go对于字母大小写的特殊访问机制和包级函数访问机制导致的。
3、如果你习惯了隐式类型转换,那么真的很抱歉,你要习惯显示的类型转换了。当你使用fmt.Println("c = " + c)
,我们假设c
不是字符串,那么抱歉,你是一定要报错的。这个时候你需要使用熟悉的c方式,使用格式字符串,类似c中printf
,对应的函数是fmt.Printf
.
4、这个也是被吐槽的比较多的地方,就是当你声明一个局部变量的时候,它必须被使用。这个好像看起来没什么,但是有的时候真的就是会犯这种错误。
不想了不想了,毕竟这不是吐槽大会。接下来就谈谈这段时间学习的感触吧。
首先,我觉得go好像是面向结构体编程;因为struct真的有点随处可见了,当然确实是很好用。我们可以通过struct来定义方法,实现interface,是的,到处都是的interface{}
,当然这是两回事,权当一个吐槽。
它的支持多核心功能很强,这也是为什么go在云计算和微服务风生水起的原因之一;强大的goroutine
和channel
使得它的并发能力惊人。
glide管理有点类似于java中的maven,不过和maven不同的是,这并不是一个仓库,而是一个类似映射表的存在,根本原因就是go get
这个命令比较强悍的功能。说到这里就要吐槽一下,GFW的存在是学习go的噩梦,所以要想学好go,你必须得会挖墙脚。
函数的多个返回值会让你耳目一新的。
另外一个让你耳目一新的是函数可以作为参数!
defer的存在可以减少忘记关闭资源这种类似的失误。
方法和函数,函数和方法,傻傻分不清?
go的test真的挺。。。,嘛,官方的说法就是,test也是需要动脑的编程哦~
说到test,go有个挺强大的mock框架,叫做monkey,monkey.Patch
,xx.Unpatch
,挺怀念那段写mock的痛苦时光的,那时候学到了好多东西啊!
slice切片一定感觉很新奇吧,其实就是变长数组。还有个append
函数让你用个爽。另外它还有妙用呢…
go是有指针的,但是你不能像c那样自由的操纵指针,go把指针控制在了很安全的范围内让你使用,就好像你在写代码的时候,有个大人在边上监视你的感觉,go整体给人的感觉就是这样,go的设计师有着强烈的控制欲。反正是为了你好嘛。
最常见的运算符大概就是它了:=
,短变量声明,功能确实挺强的,这也得利于go的类型推导,就是不需要你显示的声明变量类型,编译器帮你做了。
go还有一个很常用的包就是flag包,可以让你设置命令行参数的哦。
go有new
,有垃圾回收,是面向对象的语言,不过我还是觉得面向结构体比较准确。
go有一种叫做类型断言的行为,在你做类型转换的时候可能会用到,说实话,挺不习惯的。不过用多了也就习惯了。
go中一个比较常用的数据协议是Protobuf,以及一种常用的rpc框架是grpc。
go自带很好用的监控工具是pprof,常用来做性能优化。当然还有一些比较好用的开源框架,像zipkin,Prometheus等,我也只是涉猎了一下。
另外虽然go build
很好用,但是工作中还是使用make
编译程序,这个就很僵硬,因为它用起来不难,学习来不简单。
唉,写来写去好像最后还是变成了吐槽大会。
那最后就来个比较有态度的结尾吧。
当你想要驳倒Gopher的时候,有句很致命的话,就是:“go这种垃圾语言连泛型都没有实现”。
不过我到现在也没想通为什么没实现泛型就成了垃圾语言了,呵呵。
有疑问加站长微信联系(非本文作者)