使用Go module创建项目

项目实例

最终目录结构

创建项目目录

创建一个目录作为项目根目录(目录名随意,我这里使用 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)目录下,可以通过 GOPATHGOBIN 来修改保存路径(使用 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

GOROOT and GOPATH

golang语言的包依赖管理方式 综述

Leave a Comment