前言
在很久很久以前,就 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