Golang中包间相对导入链接失效问题如何解决

Golang中包间相对导入链接失效问题如何解决 我有一个非常简单的GO项目:

  • Main.go
  • Readers(文件夹)
    • a.go
    • b.go

Main.go 导入了 Readers 包并调用函数 ShowArguments

import ( "fmt"
 "os"
 "./Readers"
)      
func main() {
  fmt.Println("Start dev-ops tool.")
  Readers.ShowArguments(os.Args)
}

文件 A.go 包含函数 ShowArguments:

package Readers

import ( "fmt")

func ShowArguments(incomming []string)*GeneralConfig{
  fmt.Println("Read arguments:")
  fmt.Println("Total arguments: %s", len(incomming))

  loadingWorkflows:=GeneralConfig{}

   for i := 1; i < len(incomming); i++ {
       fmt.Println(incomming[i])
       fmt.Println("============")
   }
   return &loadingWorkflows
} 

在文件 B.go 中,我添加了一个结构体,将来会返回给主函数一些关于传入参数的信息结构:

package Readers

type GeneralConfig struct {  
  RootFolder   string
  OutputFolder    string
}

这个场景完美运行。但我决定将文件 B.go 移动到其他包:Helpers。

现在文件 A.go 看起来像:

package Readers

import ( "fmt"
        _"../Helpers"
)

func ShowArguments(incomming []string)*Helpers.GeneralConfig{
  fmt.Println("Read arguments:")
  fmt.Println("Total arguments: %s", len(incomming))

  loadingWorkflows:=Helpers.GeneralConfig{}

  for i := 1; i < len(incomming); i++ {
      fmt.Println(incomming[i])
      fmt.Println("============")
  }
  return &loadingWorkflows
}

文件 B.go:

package Helpers
       type GeneralConfig struct {  
       RootFolder   string
       OutputFolder    string
}

文件结构:

  • Main.go
  • Readers
    • A.go
  • Helpers
    • B.go

当我构建这个项目时,收到错误:

Readers\A.go:7:40: undefined: Helpers

Readers\A.go:11:20: undefined: Helpers

它可以找到 Helpers 目录,但找不到 Helpers 包。 请问如何解决这个问题?

附注:请不要给我诸如"阅读GoLang初学者指南"这样的建议。我已经阅读过了。问题在于我需要在代码中使用相对路径,因为我不能使用$GOPATH和其他通用路径。我的目标是:将代码放在任何目录中,执行构建命令,然后开始使用编译后的可执行文件。


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

2 回复

1_Maximys_1:

import (
  _"../Helpers"
)

这意味着,导入并运行 init() 函数,但不使包可用,你应该删除下划线。

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


在Go语言中,相对导入路径在Go模块(Go modules)引入后已不再推荐使用。从Go 1.11开始,Go模块成为管理依赖的标准方式。要解决你的问题,需要将项目转换为使用Go模块。

以下是解决方案:

  1. 在项目根目录初始化Go模块:
go mod init your-project-name
  1. 修改你的导入语句,使用模块路径而不是相对路径。

修改后的项目结构:

- go.mod
- Main.go
- Readers/
  - A.go
- Helpers/
  - B.go

Main.go:

package main

import (
	"fmt"
	"os"
	"your-project-name/Readers"
)

func main() {
	fmt.Println("Start dev-ops tool.")
	Readers.ShowArguments(os.Args)
}

Readers/A.go:

package Readers

import (
	"fmt"
	"your-project-name/Helpers"
)

func ShowArguments(incoming []string) *Helpers.GeneralConfig {
	fmt.Println("Read arguments:")
	fmt.Printf("Total arguments: %d\n", len(incoming))

	loadingWorkflows := Helpers.GeneralConfig{}

	for i := 1; i < len(incoming); i++ {
		fmt.Println(incoming[i])
		fmt.Println("============")
	}
	return &loadingWorkflows
}

Helpers/B.go保持不变:

package Helpers

type GeneralConfig struct {
	RootFolder   string
	OutputFolder string
}
  1. 构建项目:
go build

这样配置后,你的项目就可以在任何目录中构建和运行,不需要设置GOPATH。Go模块会自动处理包之间的依赖关系。

如果你坚持要使用相对导入(虽然不推荐),可以这样修改Readers/A.go:

package Readers

import (
	"fmt"
	"../Helpers"
)

func ShowArguments(incoming []string) *Helpers.GeneralConfig {
	// 函数体保持不变
}

但需要注意,相对导入只能在非模块模式下工作,且需要设置正确的GOPATH。使用Go模块是更现代和可靠的解决方案。

回到顶部