我刚开始使用Go的模块,无法建立build而感到困惑
刚开始使用Go模块时遇到了编译不通过的困难。
完成Hello World后,我想当会有一个时刻,你会希望将在main.go中定义的函数切分到另一个目录中。
那个时候,由于构建无法通过,解决问题花费了一些时间。
如果不使用go module,在GOPATH下创建项目目录和使用go的modules时,外部包的调用路径指定方式是不同的。目前,网络上的信息更多是旧的信息,
我认为这是一个相当大的盲点,所以我将其留作备忘录。
$ go version
>> go version go1.13.4 darwin/amd64
什么让你感到困扰?
piyo
├── go.mod
├── go.sum
└── main.go
package main
import "fmt"
main(){
hoge()
fuga()
return nil
}
func hoge() {
fmt.Println("hogehoge")
}
func fuga() {
fmt.Println("fugafuga")
}
我希望将如上所述的项目,按照下面的方式,将函数分割到另一个目录中。
piyo
├── go.mod
├── go.sum
├── main.go
└── cmd
├── hoge.go
└── fuga.go
因此,我按以下方式进行了文件分割。
package main
import (
"fmt"
"./cmd"
)
main(){
cmd.hoge()
cmd.fuga()
return nil
}
package cmd
func Hoge() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
fmt.Println("hogehoge")
}
package cmd
func Fuga() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
fmt.Println("fugafuga")
}
在这里进行构建时报错,无法完成构建!
$ go build
>> build _/Users/username/workspace_golang/github.com/username/piyo/cmd: cannot find module for path _/Users/username/workspace_golang/github.com/username/piyo/cmd
找不到路径中的模块…意思是无法找到piyo目录…
说到结论,如果使用绝对路径而不是相对路径导入包,那么构建就会成功通过!
再試一下用更详细的方式重述。
使用Go模块
从Go 11.1开始,我们可以使用模块(modules)功能。
我想,详细的内容可以在各种文章和官方文件中找到。但是与以前不同的是,现在无论在GOPATH之外还是在外部,都可以使用外部包。
由于必须在GOPATH目录下创建项目目录,这显得有些不方便,我认为将这个功能纳入是一个不错的选择。
$ mkdir workspace_golang
$ cd workspace_golang
$ mkdir piyo
$ cd piyo
$ go mod init github.com/username/piyo
我在GOPATH之外的家目录下创建了一个名为workspace_golang的学习目录,并在其中创建了项目目录。
通过编译的main.go文件。
package main
import (
"fmt"
- "./cmd"
+ "github.com/username/piyo/cmd
)
main(){
cmd.hoge()
cmd.fuga()
return nil
}
这是非常重要的。
使用Go模块时,当从外部包调用函数等时,务必使用绝对路径进行调用!