我很难将本地go文件导入另一个go文件。
我的项目结构如下所示
-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
我正在尝试在b.go中导入a.go.我尝试了以下内容,
import "a"
import "github.com/xxxx/a"
这些都没有奏效。我明白我必须干涉GOPATH,但我无法做到正确。目前我的GOPATH指向samplego(/ workspace / samplego)。我得到以下错误
cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)
此外,当这些源文件导入另一个项目/模块时,GOPATH如何工作?那么当地的进口是一个问题吗?在这种情况下,最佳做法是什么 - 它是否只在模块中有一个go文件(带有相关的测试)?
答案 0 :(得分:49)
目录中的任意数量的文件都是单个包;在一个文件中声明的符号可供其他人使用,而不包含import
个或限定符。所有文件都需要在顶部使用相同的package foo
声明(或者您将从go build
收到错误)。
您需要将GOPATH
设置为pkg
,src
和bin
目录所在的目录。这只是一个偏好问题,但通常为您的所有应用设置一个工作区(有时为$HOME
),而不是每个应用一个。
通常Github路径为github.com/username/reponame
(不仅仅是github.com/xxxx
)。因此,如果你想拥有main
和另一个套餐,你最终可能会在workspace/src
之下做一些事情
github.com/
username/
reponame/
main.go // package main, importing "github.com/username/reponame/b"
b/
b.go // package b
请注意,您始终使用完整的github.com/...
路径导入:工作区中不允许相对导入。如果您厌倦了键入路径,请使用goimports
。如果您使用go run
,那么是时候切换到go build
:run
与多文件main
交易不佳而且我没有费心去测试但是听到了(来自Dave Cheney here)go run
不重建脏依赖。
听起来你至少试图将GOPATH设置为正确的东西,所以如果你仍然卡住,可能包括你如何设置环境变量(命令等)以及你运行的命令和什么错误发生了。 Here are instructions on how to set it (and make the setting persistent) under Linux/UNIX和here is the Go team's advice on workspace setup。也许两者都没有帮助,但是如果你感到困惑,请看一看,至少指出哪一部分会让你感到困惑。
答案 1 :(得分:20)
只要您声明a.go
和b.go
位于同一个包中,就无需导入。然后,您可以使用go run
识别多个文件:
$ go run a.go b.go
答案 2 :(得分:8)
./ main.go(在主包中)
./a/a.go(in package a)
./a/b.go(in package a)
在这种情况下:
main.go import" ./ a"
它可以调用a.go和b.go中的函数,即首字母大写字母。
答案 3 :(得分:0)
我只是想要一些真正基本的东西来将一些文件移出主文件夹,例如user2889485的回复,但是他的特定答案对我没有用。我不在乎它们是否在同一包装中。
我的GOPATH工作区为c:\work\go
,在此之下我拥有
/src/pg/main.go (package main)
/src/pg/dbtypes.go (pakage dbtypes)
在main.go
我import "/pg/dbtypes"
答案 4 :(得分:0)
正如人们之前提到的,没有必要使用任何导入。
很多人在提到大多数文件时都提到使用 go run 是可能的,但是当在同一个目录中有多个 .go-files 时,它可能很麻烦。
因此,我通常会使用 class CategorySerializer(TaggitSerializer, serializers.ModelSerializer):
author = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all())
posts = PostSerializer(many=True, read_only=True)
tags = TagListSerializerField()
class Meta:
model = Category
fields = ('id', 'name', 'description', 'created_at', 'updated_at', 'posts', 'tags', 'author')
# User Serializer
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ('id', 'email')
。