学习go语言

什么是go语言

Go语言的设计初衷是这样的:

  • 针对其他语言的痛点进行设计
  • 并加入并发编程
  • 为大数据,为服务,并发而生的通用编程语言

Go语言很特别:

  • 没有对象,没有继承多态,没有泛型,没有try/catch
  • 有接口,函数式变成,csp并发模型(goroutine + channel
  • 学习go语言重要的不是语法,而是改变三观

Go语言的学习路线:

  • 基本语法:变量,选择,循环等
  • 面向接口:结构体,duck typing的概念,组合的思想
  • 函数式编程:比如闭包的概念
  • 工程化:资源管理,错误处理,测试和文档,性能调优
  • 并发编程goroutinechannel,理解调度器

实战项目的架构图: 项目架构图

Go的安装

登录到https://studygolang.com/dl然后下载对应系统的文件,然后傻瓜式的一步步安装即可。

安装完后可以在命令行中使用go或者go version来查看go的安装是否成功和具体的下载版本。

我们强调要使用1.13.3以后的版本,因为在这个版本后面会有一个对国内的用户非常好的功能,就是镜像功能通过go env命令来查看go的一些设置,可以看到GOPROXY=https://proxy.golang.org,direct,这个配置就是帮助我们拉取一些依赖的时候直接从https://proxy.golang.org这个网址拉取,如果不行,就重定向到原本的地址中去拉取。

1. 修改镜像

但是https://proxy.golang.org在国内连接依旧比较困难,我们可以使用一个国内的镜像:goproxy.cn,所以我们可以在终端执行命令:

go env -w GOPROXY=https://goproxy.cn,direct

2. 修改模块

做过Go项目的同学应该知道GOPATH是个比较烦人的东西,在新版本当中我们需要设置一个GO111MODULE的东西,这个东西好比一个开关,在GOPATH路径下面GO111MODULE的值就是on,否则就是off,为来避免不必要的坑,统一设置为on:

go env -w GO111MODULE=on

3. 下载goimports

在你的命令行中执行:

go get -v golang.org/x/tools/cmd/goimports

4. 配置IDE

  • GoLand

    • Goland自身就包含go的插件和file watcher插件,所以我们不需要下载。我们打开File/setting查询修改parameter hintoff,取消参数提醒
    配置1
    • 并且查询修改file watcher,点击加号,添加goimports,然后点击ok即可,这样保存之后就能执行goimports之前那个下载的插件的功能了,格式化代码。
    配置2
  • idea + Go插件

    • 如果你使用这种方式需要在打开编辑器的时候通过configure/plugins去下载Go的插件和file watcher插件,后者是能利用之前我们下载的goimports来在保存文件的时候去格式化代码的。然后创建这个项目的时候需要选择Go Modules,然后修Proxyhttps://goproxy.cn,direct,然后创建一个项目。
    • 创建一个hello的文件,然后书写一段简单的代码:
    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("hello world")
    }
    

    点击func左边的小绿点执行即可

    • 我们打开File/setting查询修改parameter hintoff,取消参数提醒,并且查询修改file watcher,添加goimports,这样保存之后就能执行goimports之前那个下载的插件的功能了,格式化代码。
  • VS code

    • vscode虽然没有创建项目的能力,但是有扩展提示,但是使用了go语言,它会提示你去下载go文件的相关扩展。
    • 然后我们启动项目都需要使用go run hello.go这样的命令
    • 另外go.modvs code也需要使用命令行手动生成:go mod init learngolearngo是名字,你可以自己取。

Go的依赖管理

什么叫做依赖?依赖就是我们在书写项目的时候不可能任何功能都要我们自己写,会大量的引入第三方库,将代码创建在别人的基础设施之上

依赖管理经历了三个阶段:GOPATHGOVENDORgo mod,所以对于当前的我们学习的重点就是简单的了解一下前两个的流程,重点学习go mod的依赖管理,因为go mod是真正将go的依赖做进了go的命令当中。

1. GOPATH

GOPATH说白了就是一个目录的路径,默认都是计算机的/go目录下面,然后所有的依赖都会放在这目录下,也就是所有的项目的依赖,反正你只要引入第三方,我就去GOPATH找,那这样的坏处当然就是体积会越来越大,如果你做的项目多了,时间也很久,这个目录的体积差不多和镜像一样了。当然了这还不是重要的问题,因为所有的项目的所有的依赖都是放在GOPATH对应的目录下,那么问题就来了:两个项目如果使用的是不同版本的第三方依赖,此时GOPATH对应的第三方依赖只有一个版本,怎么解决?

2. GOVENDOR

GOVENDOR就是解决不同项目对相同依赖不同版本的问题的,每个项目目录下会创建一个vandor的目录,放一些第三方依赖,当项目中引入了第三方依赖,会优先到这个目录下寻找是否有该库,找不到在到外面的GOPATH中找,但是通过go get下载下来的默认都在这个GOPATH对应的目录下,我们不想手动将其拷贝到项目中的vendor目录,就产生了大量的依赖管理工具:glidedep,go dep等等,通过配置它们给出的配置文件来管理依赖。

但是通过上面GOPATHGOVENDOR外加上依赖管理工具,这一套下来简直就像在打补丁,越来越难,所以在现在的版本.终于通过go mod来原生的管理依赖

3. go mod

使用go mod后,(通过在idea中创建go module的项目),然后会将所有依赖的信息放在go.mod文件中,并且产生一个go.sum文件来记录各个依赖和版本的以及哈希的详情,如果要更新版本,直接下载新的版本,然后使用go mod tidy 这个命令来清理不用的第三方依赖

如果你使用的idea或者goland,那么这些东西可以在创建项目的时候直接使用go(module)创建项目,之前我们在最前面就说过,然后如果使用vscode,我们需要这样来操作:创建一个空的文件(比如test),然后通过cd进入test,使用命令go mod init test,但是代理好像就不用设置了,因为最开始我们就已经设置过了。

如果你还有不懂的,可以参照这个下面两个网址:

下载第三方依赖基本就使用go get命令就可以,但是我推荐你下载一个依赖的时候,最好去github上使用正规的人家给出的下载命令

如果有旧的项目要迁移到go mod上,基本上两个命令就能搞定:

go mod init xxx
go build ./...

go mod init xxx很好理解,就是当前文件创建go mod的依赖管理的方式,go build ./...就当前项目根目录和子目录都去编译一遍,看看有没有出错,这个命令如果项目中有两个以上的module是不会产生可执行文件的,如果你想产生可执行文件,你需要使用这个命令:go install ./...,会将所有产生的结果放在go/bin的目录下。

go mod总结

  • 由go命令统一的管理,用户不必关心目录结构
  • 初始化:go mod init
  • 更新依赖:go get [@v]; go mod tidy
  • 迁移旧项目:go mod init,go build ./...

4. 目录结构

对于目录结构,尤其对于main来讲,必须单独放在一个目录中,同一个目录下不能有多个文件中都包含main函数,这些文件都必须通过单独创建一个目录来存放。

参考资料

  1. Go语言四十二章经
  2. Google资深工程师深度讲解Go语言
  3. 深入解析Go
  4. Go语言核心36讲
  5. Go语言标准库实践
Last Updated: 1/20/2020, 4:40:43 PM