Golang中如何实现简单的依赖导入
Golang中如何实现简单的依赖导入
首先感谢您的帮助。我编程经验尚浅。我有两个依赖和一些代码,第一个是 puppy:
package puppy
func Bark() string{
return "Woof!"
}
func Barks() string {
return "Woof! Woof! Woof!"
}
接下来是 dog:
package dog
import (
"strings"
)
func WhenGrownUp(s string) string {
return "When the puppy grows up it says: " + strings.ToUpper(s)
}
最后是将两者结合起来的代码:
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
你好,@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命令查看依赖图,以识别循环依赖。

