Golang中无法导入包的问题如何解决

Golang中无法导入包的问题如何解决 错误信息: 无法导入 entities 包(在任何路径中都找不到包 "entities" /usr/lib/go-1.20/src/entities (来自 $GOROOT) /home/jk/go/src/entities (来自 $GOPATH))

我有一个简单的项目结构: entities|entity.go main.go

entities 是一个包。它尝试按照以下路径查找 /home/jk/go/src/entities (来自 $GOPATH))

Снимок экрана от 2023-03-29 11-17-42

但项目实际位于 /home/jk/go/src/go_test。

我应该如何修复这个问题?

package entities

type Entity struct {
	id   int
	name string
}

func (Entity) newEntity(id int, name string) *Entity {
	return &Entity{id, name}
}
package main

import (
	"fmt"
	"entities"
)

func main() {
	ent := entities.newEntity(1, "name")
	fmt.Println(ent)
}

更多关于Golang中无法导入包的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

非常感谢! 如果我理解正确的话,我无法使用像C++中那样的简短写法机制,对吗?

#include "enitites" // instead path/entities

更多关于Golang中无法导入包的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不,这已经是最简洁的写法了。基于模块的导入路径有助于避免歧义。想象一下,你创建了一个名为 os 的包,并将其导入为 os。编译器将无法区分你的 os 包和标准库中的 os 包。

Go 没有相对导入路径——至少不是直接的。

你为你的模块指定的模块名称是什么?(它存储在 go.mod 文件中,以 module 开头的那一行。)

将模块名称作为前缀添加到导入路径中:

import "<your module name>/entities"

这应该能让导入正常工作。

(另请参阅 Go Playground 中的 Multiple File 示例。(其中的“文件”只是编辑器部件中的不同部分,由 -- filename.ext -- 行分隔。)模块名称是 play.ground,包 foo 位于子目录 foo/ 中,最终的导入路径是 play.ground/foo。)

根据你的错误信息和项目结构,这是典型的Go模块配置问题。以下是解决方案:

1. 初始化Go模块:

cd /home/jk/go/src/go_test
go mod init go_test

2. 修改项目结构:

go_test/
├── go.mod
├── main.go
└── entities/
    └── entity.go

3. 修正代码:

entities/entity.go:

package entities

type Entity struct {
	ID   int
	Name string
}

// 注意:导出函数需要大写字母开头
func NewEntity(id int, name string) *Entity {
	return &Entity{id, name}
}

main.go:

package main

import (
	"fmt"
	"go_test/entities" // 使用模块路径导入
)

func main() {
	ent := entities.NewEntity(1, "name")
	fmt.Println(ent)
}

4. 如果使用旧版GOPATH模式,需要设置环境变量:

export GO111MODULE=off

然后将项目移动到GOPATH路径下:

/home/jk/go/src/go_test/

关键点说明:

  • Go 1.11+默认使用模块模式,不再依赖GOPATH
  • 导出函数和字段需要大写字母开头(NewEntity而不是newEntity)
  • 导入路径基于go.mod中的模块名

运行验证:

cd /home/jk/go/src/go_test
go run main.go
回到顶部