转载

Go的学习总结

在上家公司工作了两月余,将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在云计算和微服务风生水起的原因之一;强大的 goroutinechannel 使得它的并发能力惊人。

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这种垃圾语言连泛型都没有实现”。

不过我到现在也没想通为什么没实现泛型就成了垃圾语言了,呵呵。

原文  https://studygolang.com/articles/17892
正文到此结束
Loading...