Golang中如何实现简单的依赖导入

Golang中如何实现简单的依赖导入 首先感谢您的帮助。我编程经验尚浅。我有两个依赖和一些代码,第一个是 puppy

package puppy

func Bark() string{
return "Woof!"
}

func Barks() string {
return "Woof! Woof! Woof!"
}

github.com/dancoe77/008-puppy

接下来是 dog

package dog

import (
	"strings"
)

func WhenGrownUp(s string) string {
	return "When the puppy grows up it says: " + strings.ToUpper(s)
}

github.com/dancoe77/009-dog

最后是将两者结合起来的代码:

package main

import(
	"fmt"
	"github.com/dancoe77/008-puppy"
	"github.com/dancoe77/009-dog"
)
func main(){
	s1 := puppy.Bark()
	s2 := puppy.Barks()
	fmt.Println(s1)
	fmt.Println(s2)
	
	s3 := dog.BigBark()
	s4 := dog.BigBarks()
	fmt.Println(s3)
	fmt.Println(s4)
	
	//also like this
	
}

049-Modular_code_dependency_mgmt_part2

我已经反复检查了很多次,没有发现任何循环依赖,但是当我运行 main.go 时,却得到了“不允许的导入循环”错误。所以我猜肯定存在某个循环依赖,只是我没有发现。


更多关于Golang中如何实现简单的依赖导入的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢:)!!我真的很感激:))

更多关于Golang中如何实现简单的依赖导入的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,@dancoe77,欢迎来到论坛。

确实不存在循环依赖,我花了一些时间才注意到,但你的仓库 049-Modular_code_dependency_mgmt_part2 在其 go.mod 文件中将自己声明为 008-puppy 模块:

module github.com/dancoe77/008-puppy

在我将模块路径改为

module github.com/dancoe77/049-Modular_code_dependency_mgmt_part2

之后(在 GitHub Codespaces 中操作,随后执行了 go mod tidy),循环依赖的错误就消失了。

在Go中,循环依赖通常发生在两个或多个包相互导入时。从你的代码来看,问题在于dog包试图导入puppy包,而main包同时导入了这两个包,但dog包中并没有使用puppy包的功能。

首先,检查dog包的代码。根据你提供的dog包代码,它只导入了strings包,并没有导入puppy包。但错误提示可能存在循环依赖,所以请确认dog包的实际代码。如果dog包确实导入了puppy包,那么循环依赖就发生了,因为puppy包可能也导入了dog包(或者通过其他方式间接导入)。

为了修复这个问题,你需要重构代码以避免循环导入。以下是一个示例,展示如何调整dog包以避免导入puppy包:

步骤1:修改dog包,移除对puppy包的依赖 假设dog包原本试图使用puppy包的功能,你可以通过将共享功能移到独立的包中,或者使用接口来解耦。这里,我们假设dog包只需要处理字符串,而不直接依赖puppy包。

dog.go(修改后):

package dog

import (
	"strings"
)

func WhenGrownUp(s string) string {
	return "When the puppy grows up it says: " + strings.ToUpper(s)
}

// 如果dog包需要处理puppy包的输出,可以通过参数传递,而不是直接导入puppy包
func BigBark() string {
	return WhenGrownUp("Woof!")
}

func BigBarks() string {
	return WhenGrownUp("Woof! Woof! Woof!")
}

步骤2:确保puppy包不导入dog 检查puppy包的代码,确保它没有导入dog包。根据你提供的代码,puppy包是独立的,没有导入其他包。

puppy.go(保持不变):

package puppy

func Bark() string {
	return "Woof!"
}

func Barks() string {
	return "Woof! Woof! Woof!"
}

步骤3:更新main包以使用修改后的dog main.go(修改后):

package main

import (
	"fmt"
	"github.com/dancoe77/008-puppy"
	"github.com/dancoe77/009-dog"
)

func main() {
	s1 := puppy.Bark()
	s2 := puppy.Barks()
	fmt.Println(s1)
	fmt.Println(s2)
	
	s3 := dog.BigBark()
	s4 := dog.BigBarks()
	fmt.Println(s3)
	fmt.Println(s4)
}

步骤4:运行代码 在项目根目录下,确保有go.mod文件(可以通过go mod init <module-name>创建),然后运行:

go run main.go

输出应该为:

Woof!
Woof! Woof! Woof!
When the puppy grows up it says: WOOF!
When the puppy grows up it says: WOOF! WOOF! WOOF!

如果问题仍然存在,请检查go.mod文件中的依赖路径是否正确,并确保没有其他隐藏的循环导入。你可以使用go mod graph命令查看依赖图,以识别循环依赖。

回到顶部