(一)前言
和Java一样,Golang也无法直接引用项目以外的公共单元代码。
PS:当然Go更过分,要求代码得放在%GOPATH%/src
中……
幸好后来有了go mod
(go modules) (go 模块)
是Golang在1.11版本时加的特性。
我们需要做的就是:
- 将公共单元作为一个单独的模块。
- 其它项目用模块的方式引入这个jar包。
(二)制作公共单元(模块)
这步比较简单,可以从一个可执行的项目开始修改(还是这么懒)。
去掉main函数和相关单元,仅保留公共模块单元。
这个例子和普通的go mod程序没什么不同。
但是不像Java需要打包成Jar,这个模块并不需要编译(但得保证编译能过啊)成exe,保留源代码状态就OK。
go.mod
例子如下,那堆require可以无视:
module my.pub.utils/my-public-utils
go 1.19
require (
github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea
golang.org/x/text v0.3.7
)
require (
github.com/fatih/color v1.13.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24 // indirect
)
呃,如果你的Go项目并不是基于模块,那么……
先go mod init
生成go.mod文件吧。
这部分不在讨论中。
(三)项目使用自定义的公共单元
(3.1)修改go.mod
需要在项目的go.mod
加入公共单元模块,并指定它的目录位置。
相对路径也可以。
module myid.ac.com
go 1.19
require my.pub.utils/my-public-utils v1.0.0
replace my.pub.utils/my-public-utils => ..\..\..\PublicGo\my-utils
require (
github.com/fatih/color v1.13.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea // indirect
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 // indirect
golang.org/x/text v0.3.7 // indirect
)
(3.2)源代码import
当然,
代码中需要引入才能用:
......
import (
"bufio"
"fmt"
"io"
"os"
"path"
"path/filepath"
"runtime"
"runtime/debug"
"strconv"
"strings"
"sync"
"time"
unit1 "my.pub.utils/my-public-utils/part1"
unit2 "my.pub.utils/my-public-utils/part2"
Unit3 "my.pub.utils/my-public-utils/part3"
)
func main() {
......
unit1.function1(a,b,...)
......
}