Golang中无法使用package包的解决方法
Golang中无法使用package包的解决方法 我在使用包时遇到了问题。我完全按照网上找到的步骤操作,但收到了错误信息。
我在GOPATH中有这个包: go/src/greet/day.go
package greet
var morning = "Good morning"
var Morning = "hey" + morning
我想在我的代码中导入它: go/src/app/entry.go
package main
import ("fmt"
"greet")
func main(){
fmt.Println(greet.Morning)
}
当我运行entry.go时,收到这条消息:entry.go:4:3: package greet is not in GOROOT (/usr/local/go/src/greet)
有人知道如何修复这个问题吗?
谢谢。
更多关于Golang中无法使用package包的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
现代 Go 已不再依赖 GOPATH。
请使用带有适当模块路径的正确模块。
为了使用一个包,Go 必须知道该包的位置。在你的示例中,有两种方法可以实现这一点。但首先,请将目录移出 $GOPATH 之外。
如果你希望 “greet” 成为一个可以独立于 “app” 使用和维护的库项目,那么你就有两个模块。如果 “greet” 和 “app” 在同一个父目录下,那么:
cd greet
go mod init greet
go mod tidy
cd ../app
go mod init app
编辑 app/go.mod 并添加这一行:
replace greet => ../greet
然后:
go mod tidy
go build entry.go
go mod init 会创建一个 go.mod 文件,你也可以手动创建或编辑它。
go mod tidy 会创建一个 go.sum 文件。
如果你没有在其他地方导入这个应用模块,那么你给它起什么名字并不重要。你可以将其命名为 “main” (go mod init main)。
如果你将 greet/ 和 app/ 放在同一个模块中,情况会更简单。将 app/ 移到 greet/ 内部,这样你就得到了如下的文件结构:
greet/day.go greet/app/entry.go
首先,删除上一步中创建的任何 go.mod、go.sum 文件。
然后:
cd greet
go mod init greet
go mod tidy
cd ./app
go build entry.go
在这两种情况下,你都有两个包,但在第一种情况下你有两个模块,而在第二种情况下你只有一个模块。
根据你的描述,这是典型的Go模块配置问题。错误信息表明Go编译器只在GOROOT中查找包,而没有在你的GOPATH中搜索。以下是两种解决方案:
方案一:使用GOPATH模式(传统方式)
确保正确设置GOPATH环境变量,并将你的项目放在GOPATH/src目录下:
# 设置GOPATH(如果尚未设置)
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# 确认目录结构
# $GOPATH/src/greet/day.go
# $GOPATH/src/app/entry.go
然后从app目录运行:
cd $GOPATH/src/app
go run entry.go
方案二:使用Go Modules(推荐方式)
在项目根目录初始化Go模块:
# 进入项目目录
cd /path/to/your/project
# 初始化go.mod文件
go mod init myproject
# 目录结构应调整为:
# myproject/
# ├── go.mod
# ├── greet/
# │ └── day.go
# └── app/
# └── entry.go
更新day.go文件位置,确保在项目根目录下:
// greet/day.go
package greet
var morning = "Good morning"
var Morning = "hey" + morning
更新entry.go的导入路径:
// app/entry.go
package main
import (
"fmt"
"myproject/greet" // 使用模块路径
)
func main() {
fmt.Println(greet.Morning)
}
然后运行:
go run app/entry.go
方案三:使用相对导入(同一模块内)
如果greet和app在同一模块中,可以使用相对导入:
// app/entry.go
package main
import (
"fmt"
"../greet" // 相对路径导入
)
func main() {
fmt.Println(greet.Morning)
}
运行:
cd app
go run entry.go
验证步骤
检查当前Go环境配置:
# 查看Go环境
go env GOPATH
go env GOROOT
# 检查是否启用模块
go env GO111MODULE
如果GO111MODULE是auto或on,建议使用方案二的Go Modules方式,这是Go 1.16+版本的推荐做法。

