Golang基础模块开发求助指南
Golang基础模块开发求助指南 我一直尝试编写一个主程序,用于打印来自独立模块的消息,但我找到的所有教程都令人困惑,因为它们只给出了一个“Hello World”示例,然后就直接跳转到其他主题,比如使用测试函数或导入他人的代码……
$go env (linux)
GOPATH="/home/user/go"
GOROOT="/usr/local/go"
GO111MODULE=""
文件… /home/user/go/hello/hello.go /home/user/go/hello/main.go
hello.go
package hello
fund Hello() string{
return “Hello”
}
main.go
package main
import (
“fmt”
“hello”
)
func main(){
fmt.Println(hello.Hello())
}
在 /home/user/go/hello 目录中,我执行了 go mod init。
go: cannot determine module path for source directory /home/user/go/hello (outside GOPATH, module path must be specified)
于是我尝试了 go mod init hello。
go: creating new go.mod: module hello
文件 go.mod 包含:
module hello
go 1.16
如果我运行 go run main.go:
main.go:5:1: found packages hello (hello.go) and main (main.go) in /home/user/go/hello
……
如果我尝试通过创建一个新文件夹 /home/user/go/main 并将 main.go 放入其中来纠正,然后执行 go mod init 并移除之前创建的 go.mod,我会得到这个错误:
package hello is not in GOROOT (/usr/local/go/src/hello)
为了让这个主程序调用 hello 模块,我应该怎么做……?
更多关于Golang基础模块开发求助指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你的主模块需要能够通过 go get 获取你的 hello 模块。如果模块路径没有告诉 go get 如何获取该模块(例如,如果模块不是一个 URL,就像你的情况),它会在你的 GOROOT 中查找(例如,就像 “fmt”、“io” 等包的工作方式)。
我认为让这个功能正常工作的方式是使用 replace 指令,在你的主模块的 go.mod 文件中告诉 go 你的 hello 模块位于何处。
更多关于Golang基础模块开发求助指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的回复,这为我提供了一些调查方向。经过8个小时的抓耳挠腮,我终于让它运行起来了,但这并不是我想要的答案。 我不指望遇到同样困境的人会找到这个,但以防万一……
我必须做的是:
创建 $GOPATH/projectname/main.go
创建 $GOPATH/projectname/hello/hello.go
(我的 $GOPATH 是 /home/username/go,因为我使用的是 Linux 系统。)
main.go
package main
import (
"fmt"
"projectname/hello"
)
func main(){
fmt.Println(hello.Hello())
}
hello/hello.go
package hello
func Hello() string{
return "Hello"
}
完成这些后,在 projectname 文件夹中,我必须输入:
go mod init projectname
现在,go run main.go 终于可以运行并返回 “Hello” 了。
我终于可以开始编码了。难以置信的是,我不得不自己摸索出其中的一些步骤。所有面向初学者的 Go 语言教程都糟糕透了。
根据你的描述,问题在于同一个目录下包含了两个不同包(hello 和 main)的 Go 文件。Go 语言要求一个目录只能包含一个包。以下是解决方案:
1. 创建正确的模块结构
首先,清理当前目录并重新组织:
# 删除旧的 go.mod 文件
rm -rf /home/user/go/hello/go.mod
# 创建模块目录结构
mkdir -p /home/user/go/example
cd /home/user/go/example
2. 创建 hello 模块
# 创建 hello 模块目录
mkdir -p /home/user/go/example/hello
cd /home/user/go/example/hello
创建 /home/user/go/example/hello/hello.go:
package hello
func Hello() string {
return "Hello from module"
}
初始化 hello 模块:
cd /home/user/go/example/hello
go mod init example.com/hello
3. 创建主程序
# 创建主程序目录
mkdir -p /home/user/go/example/cmd
cd /home/user/go/example/cmd
创建 /home/user/go/example/cmd/main.go:
package main
import (
"fmt"
"example.com/hello"
)
func main() {
fmt.Println(hello.Hello())
}
初始化主程序模块并添加依赖:
cd /home/user/go/example/cmd
go mod init example.com/cmd
go mod edit -replace example.com/hello=../hello
go mod tidy
4. 更新 hello 模块的 go.mod
cd /home/user/go/example/hello
go mod edit -replace example.com/hello=.
5. 运行主程序
cd /home/user/go/example/cmd
go run main.go
输出应该是:
Hello from module
替代方案:使用单个模块
如果你想要更简单的结构,可以使用单个模块:
# 创建项目目录
mkdir -p /home/user/go/myproject
cd /home/user/go/myproject
创建 go.mod:
go mod init myproject
创建目录结构:
mkdir -p hello
创建 hello/hello.go:
package hello
func Hello() string {
return "Hello from package"
}
创建 main.go:
package main
import (
"fmt"
"myproject/hello"
)
func main() {
fmt.Println(hello.Hello())
}
运行:
go run main.go
关键点是:一个目录只能包含一个包,模块路径需要正确配置,并且导入路径需要与模块声明匹配。

