项目实例
最终目录结构

创建项目目录
创建一个目录作为项目根目录(目录名随意,我这里使用 go_practice ),在在其下面创建一个子目录(sub_pkg)用于演示package的引用方式
初始化GOMODULE
在 go_practice 目录下执行命令
go mod init hunt/practice
其中 hunt/practice
是该 module 名,其他 module 需要引入该 module 时就使用该名称引入,该名称可设置为任何合法字符串 “mypractice”、”dir1/dir2/dir3″、”github.com/some/dependency” 等。
命令执行完成之后会在该目录下生成一个 go.mod
文件,该文件维护该module的依赖(初始化项目没有依赖,所有是空的)

创建go文件
首先在 sub_pkg
下创建一个 say_hi.go
,用于演示调用本地package的情况
// 包名建议和目录名相同,此处为了演示效果设置一个不同的名称
package hi
import (
"fmt"
)
// 方法名开头大写可被其他package调用,否则视为private只能同包使用
func Say() {
fmt.Println("hi")
}
再在 sub_pkg
下创建一个 thirdpart.go
,用于演示调用第三方库的情况
// 注意,同一个目录下的go文件同属于同一个package,故设置package名相同(若设置不同名称会编译报错)
package hi
import (
"fmt"
"rsc.io/quote"
)
func Third_say() {
fmt.Println("third part pkg say: " + quote.Go())
}
然后在根目录 go_practice 下创建一个 my_main.go
// 执行入口的包名和方法名必须为 main
package main
import (
"fmt"
"hunt/practice/sub_pkg" // 同module下package引入方式:{module_name}/pkg_dir_name
)
// 执行入口方法名需为 main
func main() {
fmt.Println("main function")
// 使用 {package_name}.{function_name} 方式调用
hi.Say()
hi.Third_say() // 同一package下的方法,即使在不同的文件也能直接调用
}
注意:package引入时使用的是目录名,而调用其方法是使用的是package名称(约定俗成情况下,两者应设置为统一的名称)
下载依赖
下载依赖是针对上述 thirdpart.go
文件说的,因为它引入了一个外部的包 rsc.io/quote
,在根目录下执行命令
go mod tidy

再次查看 go.mod
文件

下载下的依赖都将存放在 module cache(GOPATH/pkg/mod)中,若要清理(删除)这些包,则可以使用命令
# 清理下载的包
go clean -modcache
执行
使用命令
go run .
.
表示当前目录为 main package,并自动寻找 main function

打包exe
在项目根目录使用命令(三者之一)
go install hunt/practice
go install .
go install
默认情况下 go install
将会编译项目并打包成exe格式放到 $HOME/go/bin/
(linux)或 %USERPROFILE%\go\bin\
(windows)目录下,可以通过 GOPATH
和 GOBIN
来修改保存路径(使用 go env 查看)。
如果设置了 GOBIN,则将exe放在其目录下
如果设置了 GOPATH,则会将exe文件放到第一个GOPATH的 GOPATH/bin
目录下(注:GOPATH可以设置多个,用逗号隔开)
GOPATH vs GOROOT
这两者均为golang的环境变量,作为寻找package的路径,可以使用命令 go env
进行查看,或者使用命令 go env -w GOPATH=...
进行修改
GOPATH:第三方依赖被下载存放的位置,不用gomodule时也是项目源码所在位置(使用gomodule后就无需关注该目录了,将其当作代码第三方代码仓库就好了)
GOROOT:go的安装路径(也即内建库所在位置,类比JDK所在位置)
关于go module找包策略:https://blog.woyou.cool/post/4322