导入同一文件夹中的go文件

时间:2014-11-15 03:19:30

标签: import path go

我很难将本地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文件(带有相关的测试)?

5 个答案:

答案 0 :(得分:49)

目录中的任意数量的文件都是单个包;在一个文件中声明的符号可供其他人使用,而不包含import个或限定符。所有文件都需要在顶部使用相同的package foo声明(或者您将从go build收到错误)。

您需要将GOPATH设置为pkgsrcbin目录所在的目录。这只是一个偏好问题,但通常为您的所有应用设置一个工作区(有时为$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 buildrun与多文件main交易不佳而且我没有费心去测试但是听到了(来自Dave Cheney herego run不重建脏依赖。

听起来你至少试图将GOPATH设置为正确的东西,所以如果你仍然卡住,可能包括你如何设置环境变量(命令等)以及你运行的命令和什么错误发生了。 Here are instructions on how to set it (and make the setting persistent) under Linux/UNIXhere is the Go team's advice on workspace setup。也许两者都没有帮助,但是如果你感到困惑,请看一看,至少指出哪一部分会让你感到困惑。

答案 1 :(得分:20)

只要您声明a.gob.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.goimport "/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')