Golang子包相对导入问题探讨

Golang子包相对导入问题探讨 我是Go语言的新手,想通过尝试创建一个具有自定义打印格式的日志记录器来学习,因此我有以下文件结构:

logging (模块名为 github.com/NikosGour/logging
-go.mod
-main.go (用于测试库)
-src
--lib.go
--models
---model.go

main.go

package main

import (
	"fmt"

	log "github.com/NikosGour/logging/src"
)

func main() {
	fmt.Println("Kati allo")
	log.Nikos("testing")
}

src/lib.go

package logging

import (
	"fmt"

	"github.com/NikosGour/logging/src/models"
)

func Nikos(str models.My_str) {
	fmt.Println(str)
}

src/models/model.go

package models

type My_str string

这一切都正常工作,但我想知道,是否有办法相对地导入包呢?

src/lib.go 中,我希望能够这样做:

import (
	"fmt"

	"./models"
)

更多关于Golang子包相对导入问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

因为你使用的是 Go 模块管理系统,这种方式不被支持也不被推荐;指定包路径可以解决很多问题。如果你只是想在本机调试引用其他包,可以尝试使用 go work 或者在 go.mod 中添加 replace github.com/xxx/xxx => ./xxx

// 示例:在 go.mod 文件中添加 replace 指令
module example.com/myapp

go 1.21

require github.com/xxx/xxx v1.0.0

replace github.com/xxx/xxx => ./local/xxx

更多关于Golang子包相对导入问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,不支持使用相对路径导入子包。Go的导入路径必须是绝对路径,即从模块根目录开始的完整路径。

在你的项目中,正确的导入方式应该是使用模块名加上子包路径:

// src/lib.go
package logging

import (
    "fmt"
    "github.com/NikosGour/logging/src/models"  // 这是正确的导入方式
)

func Nikos(str models.My_str) {
    fmt.Println(str)
}

Go的设计哲学是明确的导入路径,这有助于代码的可读性和可维护性。相对导入在其他语言中可能导致混淆,特别是在大型项目中。

如果你想要更简洁的导入路径,可以考虑调整你的模块结构。例如,你可以将models包直接放在模块根目录下:

github.com/NikosGour/logging
├── go.mod
├── main.go
├── lib.go
└── models
    └── model.go

这样导入会更简洁:

import "github.com/NikosGour/logging/models"

或者,如果你希望保持当前结构但简化导入,可以在go.mod中使用replace指令(仅用于本地开发):

module github.com/NikosGour/logging

go 1.21

replace github.com/NikosGour/logging => ./

但请注意,replace主要用于本地开发调试,不是生产环境的推荐做法。

Go的导入系统强制使用绝对路径,这确保了代码在不同环境中的一致性。虽然对于新手来说可能需要一些适应,但这种设计避免了相对路径可能带来的各种问题。

回到顶部