五年java转Go学习之路(一)环境详解前言Go简介

前言

monkey换工作了,新公司使用Go作为开发语言,迫于生计只能放弃了用了五年的java。然而作为一名立志深耕技术的程序员,还是记录一下转语言的得与失吧。毕竟风水轮流转,今天Go比较火,大家一窝蜂的转型,明天说不准新语言就横空出世了,真是活到老学到老。我也是边学边写,如有谬误,请大家指正。

Go简介

每一门新语言的诞生都是为了解决现有语言的不足,Go项目是在Google公司维护超级复杂的几个软件系统遇到的一些问题的反思。

image.png

这是摘自Go语言圣经的一张图,可以看出Go继承了c的基因,包括像基础数据类型、指针等思想,所以我觉得如果之前有c的基础,学Go会非常轻松。还有包括来自Pascal语言系的包处理相关概念,而csp对于管道的处理更为go带来了区别于其他语言的重要特性。

另外GO的简洁编程哲学我个人非常认同,软件的复杂性是乘法级相关的,写出复杂的逻辑来解决复杂的事情难度并不高,但是通过简单的逻辑完成复杂问题的处理是非常考验程序员技术水平的一件事,但这对于以后的运维和持续优化又非常重要。

环境搭建

学习一门语言要做的第一件事,都是根据自己的计算架构以及操作系统从官网下载对应的二进制包。

对于Go,我们可以使用的安装包下载地址是:golang.org/dl/ 。如果打不开可以使用这个官方镜像地址:golang.google.cn/dl/

以我用的mac为例,将下载的二进制包解压至 /usr/local目录并且配置相应的环境变量。或者直接下载可执行文件版,这个网上教程非常多,这里不再赘述了。安装完成后可以打开命令行输入go version查看是否安装成功。

环境配置

在这个过程中,我们还需要配置3个环境变量,也就是 GOROOT、GOPATH 和 GOBIN。今天主要针对这三个环境变量进行讲解:

GOROOT:GO 语言的安装路径。

GOPATH:我们自己定义的工作空间。

GOBIN: GO 程序生成的可执行文件(executable file)的路径。

1. GO的项目结构
这三个变量跟GO语言的项目结构紧密相关:

在进行Go语言开发的时候,我们的代码总是会保存在GOPATH/src目录下。在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在GOPATH/src目录下, 产生的二进制可执行文件放在GOPATH/bin目录下,生成的中间缓存文件会被保存在 GOPATH/pkg 下。

GOPATH.jpg

你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。

而与许多编程语言一样,Go 语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。

所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。

2. 工作区

GOPAT的值可以是多个目录路径,Linux下用冒号分割,Windows使用分号分割。这时如果使用go get 会默认安装到第一个GOPATH路径

这里有两个问题需要注意:

  1. Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?

实际上这里是我们设置的GOPATH的值决定了这个顺序,Go会按照设置的工作区从左到右的进行遍历。

  1. 如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?

不会产生冲突,因为代码包的查找是按照已给定的顺序逐一地在多个工作区中进行的。

3. 构建和安装GO程序

GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目

// $GOPATH/src/mymath/sqrt.go源码如下:
package mymath

func Sqrt(x float64) float64 {
	z := 0.0
	for i := 0; i < 1000; i++ {
		z -= (z*z - x) / (2 * x)
	}
	return z
}
复制代码

这样我的应用包目录和代码已经新建完毕,注意:一般建议package的名称和目录名保持一致

构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。

如果构建的是库文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。

如果构建的是命令文件(就是mian包带有main函数的文件),那么操作的结果文件会被搬运到源码文件所在的目录中。

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。

进一步说,如果安装的是库文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。

有两种方式可以进行安装

1、只要进入对应的应用包目录,然后执行go install,就可以安装了

2、在任意的目录执行如下代码go install mymath

安装完之后,我们可以进入如下目录:

cd $GOPATH/pkg/${GOOS}_${GOARCH}
//可以看到如下文件
mymath.a
复制代码

如果安装的是命令文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。

这个.a文件是应用包,那么我们如何进行调用呢?

接下来我们新建一个应用程序来调用这个应用包

新建应用包mathapp

package main

import (
	"mymath"
	"fmt"
)

func main() {
	fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))
}
复制代码

可以看到这个的package是main,import里面调用的包是mymath,这个就是相对于GOPATH/src的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH,也是一样,Go会自动在多个$GOPATH/src中寻找。

如何编译程序呢?进入该应用目录,然后执行go build,那么在该目录下面会生成一个mathapp的可执行文件

./mathapp
复制代码

输出如下内容

Hello, world.  Sqrt(2) = 1.414213562373095
复制代码

如何安装该应用?
进入该目录执行go install,那么在GOPATH/bin/下增加了一个可执行文件mathapp, 我们把GOPATH/bin加到我们的PATH里,这样可以在命令行输入如下命令就可以执行

mathapp
复制代码

也是输出如下内容

Hello, world.  Sqrt(2) = 1.414213562373095
复制代码

总结

工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。

相关推荐

GO语言圣经 shouce.jb51.net/gopl-zh/ind…
GO语言核心36讲 time.geekbang.org/column/intr…