前言

在很久很久以前,就 push 自己学过 go 语言,但是之前只是看了一下基础语法就放弃了,实在是工作当中没有应用场景。最近发现基于 go 写的 esbuild 异军突起,想要深入研究下它的奥秘,发现看不懂。于是,打算先从 go 开始学一遍,等我把 go 学好了,再去研究 esbuild。所以,最近的几篇文章都会写 go 的一些学习心得,今天的文章就从 go 语言的模块化开始。

环境变量

brew install go

安装成功后,需要配置下面几个环境变量:

"$GOROOT/bin"

GOPATH

Preferences

GOPATH 最早出现的意义是用来进行模块管理,每个 GOPATH 中会有三个目录:

.a(archive)

一般设置为工作目录的 src 文件夹需要手动创建,其他两个目录都是编译后自动生成的。

~/Code/goland/go-story
export GOPATH="~/Code/goland/go-story"
srchellohellomain.go

hello/main.go
package main

import (
	"flag"
	"fmt"
)

var name string

func init() {
	flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

func main() {
	flag.Parse() // 解析命令行参数
	fmt.Printf("\nHello %s\n", name)
}

flag 库是 go 内置的模块,类似于 node 的 commander 库,运行后结果如下所示:

下面我们引入一个能够让命令行输出色彩更加丰富的库:colourize,类似于 node 中的 chalk。通过下面这个命令来安装依赖:

go get github.com/TreyBastian/colourize 
pkgcolourizegithub.comcolourize

go getnpm installhello/main.go
package main

import (
	"flag"
	"fmt"

	"github.com/TreyBastian/colourize"
)

var name string

func init() {
	flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

func hello(name string) {
	fmt.Printf(colourize.Colourize("\nHello %s\n", colourize.Blue), name)
}

func main() {
	flag.Parse()
	hello(name)
}
hello/main.go

默认情况下,go 依赖的加载机制为:

$GOROOTsrc$GOPATHsrc

Go Vendor

$GOPATH/src
GOPATHgo-bloggo-stroygithub.comgithub.com

vendornode_modules

go vendorgovendor
go get govendor

然后在项目目录运行如下命令。

cd ~/Code/gland/go-story/src/hello
govendor init
govendor add github.com/TreyBastian/colourize
hellovendorcolourize

govendorvendor.json

go vendor
vendorvendornode_modules$GOPATHvendor$GOROOTsrc$GOPATHsrc

配置开关

go vendor
export GO15VENDOREXPERIMENT=1
go vendor

Go Modules

go vendorvendorvendorgovendorgodepglideGOPATH
go mod
go modGOPATHGOPATHgo-story/hello/main.gogo-story/main.gosrcpkg
# 初始化 go modules
go mod init [pkg-name]

go.mod

查看其内容,发现里面会声明 go 的版本号,以及当前模块的名称。

然后我们安装依赖(不管是何种依赖管理的方式,安装方法依旧不变):

go get github.com/TreyBastian/colourize

go.mod~/go/

总结

yarnpnpm
go vendorgo modGOPATH