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 initgo: cannot determine module path for source directory /home/user/go/hello (outside GOPATH, module path must be specified)

于是我尝试了 go mod init hellogo: creating new go.mod: module hello

文件 go.mod 包含: module hello

go 1.16

如果我运行 go run main.gomain.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

3 回复

你的主模块需要能够通过 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 语言教程都糟糕透了。

根据你的描述,问题在于同一个目录下包含了两个不同包(hellomain)的 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

关键点是:一个目录只能包含一个包,模块路径需要正确配置,并且导入路径需要与模块声明匹配。

回到顶部