gpt4 book ai didi

go - 试图了解如何在我的项目和包中查找结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:41:01 25 4
gpt4 key购买 nike

在我的 main.go 中,我试图引用一个结构,但出现错误:

undefined: UserService

/main.go 与包 main

userService := &UserService{}

/services/user_service.go 与主包

type UserService struct {
// ..
}

为什么它找不到我的结构?我可以将我的/services 文件放在不同的包中吗?如果是这样,那么我将如何在我的 main.go 文件中引用它们?

最佳答案

I am running it using go run main.go.

这是一个问题。 go run main.go 只会构建 main.go。对于多个文件的项目,使用go build。然后它将找到您的源文件并构建它们。但这也行不通,因为您没有遵循源代码布局的 Go 约定。

go 工具以一种非常特殊的方式构建您的项目。您可以在 How To Write Go Code 中阅读相关内容.一般来说,源代码树是扁平的。 go build 根本找不到 services/user_service.go。您可以使用 go build -x 看到这一点。

$ tree
.
├── main.go
└── service
└── user_service.go

1 directory, 2 files

$ go build -x
WORK=/var/folders/0b/7xp2lxbd7yl0tcpms06fr3d40000gn/T/go-build148902279
mkdir -p $WORK/soq/_obj/
mkdir -p $WORK/soq/_obj/exe/
cd /Users/schwern/go/src/soq
/opt/local/lib/go/pkg/tool/darwin_amd64/compile -o $WORK/soq.a -trimpath $WORK -goversion go1.9.3 -p main -complete -buildid 08f76ca23c0110836288d4a2c698c2692588f909 -D _/Users/schwern/go/src/soq -I $WORK -pack ./main.go
# soq
./main.go:8:21: undefined: UserService

请注意,compile 仅适用于 main.go

简单的解决方案是展平您的源代码树。

$ tree
.
├── main.go
└── user_service.go

0 directories, 2 files

$ go build -x
WORK=/var/folders/0b/7xp2lxbd7yl0tcpms06fr3d40000gn/T/go-build117658131
mkdir -p $WORK/soq/_obj/
mkdir -p $WORK/soq/_obj/exe/
cd /Users/schwern/go/src/soq
/opt/local/lib/go/pkg/tool/darwin_amd64/compile -o $WORK/soq.a -trimpath $WORK -goversion go1.9.3 -p main -complete -buildid 8dfd03a3d0d09267ebc5ff9d1b8dd630d7465e9c -D _/Users/schwern/go/src/soq -I $WORK -pack ./main.go ./user_service.go
cd .
/opt/local/lib/go/pkg/tool/darwin_amd64/link -o $WORK/soq/_obj/exe/a.out -L $WORK -extld=/usr/bin/clang -buildmode=exe -buildid=8dfd03a3d0d09267ebc5ff9d1b8dd630d7465e9c $WORK/soq.a
mv $WORK/soq/_obj/exe/a.out soq

现在它工作正常。


您可能会想“但是如果我想做更复杂的事情呢?

可以编写自己的构建工具,遍历子目录以找到所有 Go 文件并将它们提供给 go build。但这违背了 Go 的本质,随着时间的推移,您会发​​现自己不得不颠覆越来越多的工具。

Go 的设计旨在降低复杂性。带有子目录的大型源代码树鼓励复杂性并允许纠缠的子系统,因此 go 工具无法帮助您处理它们。 (Go 语言不关心你的文件结构,只关心 go 构建工具)。

相反,Go 处理此问题的方法是将您的服务 拆分到一个新包中。以明确的界限开发它,不要想将它耦合到其他系统,并将它导入到您的主包中。

关于go - 试图了解如何在我的项目和包中查找结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48634354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com