Go - 学习/实践

1.应用场景

Go语言潜力很大, 个人也很看好, 主要应用于中间层。

即C, C++底层[会被挤压到更低的层次]

Java业务层中间[会被提到更高的层次]的部分.

详细解读

Go 语言的未来是不可限量的。

当然,我个人觉得,Go 可能会吞食很多 C、C++、Java 的项目。

不过,Go 语言所吞食的项目应该主要是中间层的项目,既不是非常底层也不会是业务层。

也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到上层如 Java 业务层的项目。

Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,他们没有复杂的业务场景,也到不了特别底层(如操作系统)的软件项目或工具。

而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。这是我的一个判断。-- 左耳听风

2020 中国 Go 开发者调查报告  推荐阅读

Go 语言现状

2.学习/操作

插入

Go语言学习路线图 

Learn to become a Go developer

1. 前言

2007年,受够了C++煎熬Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。

被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。

Rob Pike以一种非常朴素的方式,概括了GO语言的整个设计哲学 -- 将简单、实用体现得淋漓尽致。

很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。

2. 发展历史

2007年9月,Rob Pike在Google分布式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson [大佬就是这么牛x,效率就是这么高]觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。

2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。

2009年11月 GO语言第一个版本发布。

2012年3月 第一个正式版本GO1.0发布。

2015年8月 GO1.5发布,这个版本被认为是历史性的。

完全移除C语言部分,使用GO编译GO,少量代码使用汇编实现

另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到GO1.8时,相同业务场景下的GC时延已经可以从GO1.1的数秒,控制在1ms以内。

GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。

3. GO语言关键特性

GO语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题

这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,跟随大师们的脚步,体验GO的设计哲学。

GO语言的关键特性主要包括以下几方面:

并发与协程 // goroutine go程

基于消息传递的通信方式

丰富实用的内置数据类型

函数多返回值

defer机制

反射(reflect)

高性能HTTP Server

工程管理

编程规范

另外记住一点:

函数:Go 中的一等公民

JavaScript 中 "函数是第一等公民",另外JS中一切皆对象,Linux中一切皆文件.

4. 开发过程中需要注意的点

以下是在实际开发过程中遇到的一些问题,仅供参考:

1. 异常处理统一使用error,不要使用panic/recover来模拟throw…catch,最初我是这么做的,后来发现这完全是自以为是的做法。

2. 原生的error过于简单,而在实际的API开发过程中,不同的异常情况需要附带不同的返回码,基于此,有必要对error再进行一层封装。

3. 任何协程逻辑执行体,逻辑最开始处必须要有defer recover()异常恢复处理,否则goroutine内出现的panic,将导致整个进程宕掉,需要避免部分逻辑BUG造成全局影响。

4. 在Golang中,变量(chan类型除外)的操作是非线程安全的,也包括像int这样的基本类型,因此并发操作全局变量时一定要考虑加锁,特别是对map的并发操作。

5. 所有对map键值的获取,都应该判断存在性,最好是对同类操作进行统一封装,避免出现不必要的运行时异常。

6. 定义slice数据类型时,尽量预设长度,避免内部出现不必要的数据重组。

5. 开启Go之旅

第一步 Go 语言之旅

这个是一个官方的入门教程,或者说只是一个大概了解的教程,只介绍了一些简单的东西,并且没有太多的说明。不过这个教程支持在线执行代码,还是很不错的,这个时候你都不需要有本地的开发环境。不用想太多,现在就开始,把这个教程从头到尾看一遍,练习一遍,遇到不明白的地方也不要纠结,继续向后看就行了。

官方: https://tour.golang.org

中文网: http://tour.studygolang.com

Note:

编译执行时间有些久, 推荐还是本地安装Go, 见第二步

第二步 开发环境

这里也可以忽略不看,因为每一个教程都会介绍怎么配置环境

Note:

这里个人的开发环境: Mac Pro

操作系统

个人推荐使用 Linux,可以使用 Ubuntu 或者 Fedora ,如果条件允许(不差钱) 也可以使用 Mac,当然使用 Windows 也是可以的,慢慢的就会知道 Windows 下做开发的纠结了。

开发环境

Go 的安装非常的简单,没有太多的依赖,如果是 Linux 下安装基本上下载一个二进制包,解压配置上一个环境变量、GOROOT 既可以了。

具体的可以查看官方的安装方法: 官网安装文档中文安装文档

下载页面

https://golang.org/dl/ 

https://dl.google.com/go/go1.14.2.windows-amd64.msi   // Windows msi 软件包

Note:

The package installs the Go distribution to /usr/local/go
The package should put the /usr/local/go/bin directory in your PATH environment variable. 
You may need to restart any open Terminal sessions for the change to take effect.

如果是通过下载二进制包进行安装,上面是安装的路径~

验证安装是否成功 // 注意要新开Terminal

至于源代码放置目录以及如何做个小demo,参考:

https://golang.org/doc/tutorial/getting-started

GOPATH=/Users/用户/go

开发工具

可以选择一个自己喜欢的,个人建议要用个 IDE,我使用过 vim 、Sublime、Intellji idea ,最后发现还是 IDE 比较方便,尤其是代码追踪断点等。这个不纠结那种好,有人和我说 Sublime 和 vim 安装上插件也都可以,但是个人不推荐(我以前是 Sublime 重度用户,PHP一直都在 Sublime 下开发)。

主流的文本编辑器及 IDE 的配置 官方 都有介绍,选一个自己喜欢的就可以了。

Note:

推荐使用VSCode, 需要安装插件:Go for VS Code v0.28.1

或者

Goland

第三步 看一套视频

有人可能喜欢看视频,有人可能喜欢看文档,这个根据个人爱好去选择,个人建议要看一套视频并且只看一套就够了,毕竟看视频的效率还是比较低的,看完视频一些基础的知识点就可以掌握,并且会知道一些专有名字的读法。

我以前学 PHP 的时候就从来没看过视频,导致很多名词的发音都是错的,经常被人嘲笑……,当然如果英文非常的好的同学就不用纠结了。

网上 Golang 的视频不是很多,不过也有好多套,推荐 无闻的Go编程基础,这个是被 golangcaff.comSummer整理优化过的,看起来的效果会比一些其他网站好一些。

第四步 看一篇教程

教程也有很多,看个人的喜好吧,推荐看 Go 入门指南 ,这个也是由 无闻 翻译The Way to Go ,不过社区的版本对排版进行了优化并加入了后面没有翻译完的部分。

第五步 将标准库全部都过一遍

至少要将常用的全都看一遍,如 strings / strconv / http 等,如果有能力可以将它们都记住,如果记忆力不太好(像我这样)至少也要知道有什么,用到的时候通过手册可以快速找到。

官方标准库: https://golang.org/pkg/

Standard library - pkg.go.dev -- 最新地址

中文版的标准库: Go库文档

极力推荐 https://github.com/astaxie/gopkg ,可以在学习的时候看这个,有关于标准库的详细说明和示例,学习起来会容易一些,等全都明白了要使用的时候可以去查看上面的文档。

更新:

又发现了一个不错的学习标准库的资料: 《Go语言标准库》The Golang Standard Library by Example

有点小遗憾就是不是很全,个别的包没有完成,不过 astaxie 的那个也不全,可以互相参考着看。

最后一步 完成

到这个时候,你肯定已经入门了,剩下就开始写自己的东西吧,比如写一个博客,或者 去学习一个框架,不知道怎么继续去深造的话, 就去招聘网站上看看自己喜欢的企业都要求什么,招聘要求会什么就去学什么。

Note:

当然,公司有要求,基本就只能按照公司的要求来了~

就比如,目前的公司,使用Gin框架,进行服务开发,所以,便只好去Learning Gin了

现在又换成了go-chi

6. 文档

GO - 云+社区 - 腾讯云

字符串 - Go语言圣经

GitBook - Where software teams break knowledge silos.

首页 - Go语言中文网 - Golang中文社区

Download and install - The Go Programming Language

简介 · Go语言标准库

《Go 入门指南》 | Go 技术论坛

《Go 编程基础(视频)》 | Go 技术论坛

golang生成JSON及解析JSON_TigerwolfC的博客-CSDN博客

08 | Go语言,Docker和新技术-极客时间

今日头条用Go建千亿级微服务 分析详细,适合新手理解概念[转载的] - Go语言中文网 - Golang中文社区

Go 入门教程 | Laravel 学院

2020 中国 Go 开发者调查报告

学习文档/教程 -- 推荐

前景 · Go语言中文文档

7. 教程

初级教程

Go 语言教程 | 菜鸟教程

中级教程

Go 入门教程 | Laravel 学院  // Go 基础教程 -- 文档

目前看到:  https://xueyuanjun.com/post/19783 // 数据类型篇(十一):指针的概念和基本使用   keep doing  -- 已经看过一遍

前景 · Go语言中文文档

高级教程  -- 尽快将这些知识掌握

Go语言核心36讲_Golang_Go语言-极客时间

Tony Bai · Go语言第一课-极客时间

Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间

极客时间训练营-让优秀的人一起学习  --- 试试学习

后续补充

...

3.问题/补充

TBD

4.参考

GO - 云+社区 - 腾讯云

字符串 - Go语言圣经

GitBook - Where software teams break knowledge silos.

首页 - Go语言中文网 - Golang中文社区

Download and install - The Go Programming Language

简介 · Go语言标准库

《Go 入门指南》 | Go 技术论坛

《Go 编程基础(视频)》 | Go 技术论坛

golang生成JSON及解析JSON_TigerwolfC的博客-CSDN博客

08 | Go语言,Docker和新技术-极客时间

今日头条用Go建千亿级微服务 分析详细,适合新手理解概念[转载的] - Go语言中文网 - Golang中文社区

Go 入门教程 | Laravel 学院

2020 中国 Go 开发者调查报告

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值