首页 >后端开发 >Golang >为什么从子文件夹导入文件会导致 Go 中出现'未定义”错误,如何使用 Go Modules 来解决该错误,同时保持模块化项目结构?

为什么从子文件夹导入文件会导致 Go 中出现'未定义”错误,如何使用 Go Modules 来解决该错误,同时保持模块化项目结构?

Linda Hamilton
Linda Hamilton原创
2024-11-15 11:56:02368浏览

Why does importing a file from a subfolder result in an

利用 Go 模块通过子文件夹构建项目

导航
我们希望设计具有以下结构的项目:

├── main.go
└── models
    └── user.go

在此布局中,main.go 导入 user.go 文件,该文件定义了 User 类型。然而,编译器警告主包中 User 未定义。

问题
为什么会出现此错误,如何在保持模块化项目结构的同时解决它?

解答
问题源于项目中缺少模块定义。在 Go 1.11.1 之前,Go 依赖于 $GOPATH 环境变量,这在管理项目依赖项方面带来了复杂性。

Go 模块,在 Go 1.11.1 中引入并在 Go 1.11.3 中默认启用,地址这个问题。通过启用模块(通过 GO111MODULE=on 环境变量),我们可以创建具有版本依赖关系和分层组织的模块化项目。

解决方案
要利用 Go 模块,请按照以下步骤操作:

  1. 创建一个 go.mod 文件:

    • 添加模块 定义模块名称,在本例中为 main。
  2. 按如下方式构建您的项目:
/Users/myuser/Projects/my-project/
├── go.mod
├── main.go
└── src/
    └── models/
        └── user.go
  1. 在main.go中导入user.go:

    • 在main.go中使用import "main/src/models/user"导入用户。 go 文件。
  2. 示例 main.go:

    package main
    
    import (
     "fmt"
     "main/src/models/user"
    )
    
    func main() {
     fmt.Println(user.User{"new_user"})
    }
  3. 示例用户。 go:

    package user
    
    type User struct {
     Login string
    }

这个结构允许我们将 User 类型从 models/user.go 文件导入到 main.go 文件中。 go.mod 文件定义模块名称并作为项目的根目录。

以上是为什么从子文件夹导入文件会导致 Go 中出现'未定义”错误,如何使用 Go Modules 来解决该错误,同时保持模块化项目结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn