包命名:错误导出变量

时间:2015-04-12 00:37:08

标签: go

我有一个像这样的目录结构:

Animal/
  dog/
    chiwawa.go
  rabbit.go

chiwawa.gorabbit.go都打包命名为:“package animal”位于文件顶部。但是,当我尝试在var Food = apple中使用chiwawa.go中的变量rabbit.go时,我收到错误 - undefined: Food

如果chiwawa.go直接放在Animal下没有dog目录,我就没有任何问题。

这是故意在Go吗?我可以在保留包名和目录结构的同时解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

  

How to Write Go Code

     

Workspaces

     

go工具旨在使用维护的开源代码   公共存储库。虽然您不需要发布您的代码,但是   无论你是如何设置环境的模型都是一样的   或不。

     

Go代码必须保存在工作区内。工作空间是目录   从根开始有三个目录的层次结构:

     
      
  • src包含组织到包中的Go源文件(每个目录一个包),
  •   
  • pkg包含包对象,
  •   
  • bin包含可执行命令。
  •   
     

go工具构建源包并安装生成的二进制文件   到pkg和bin目录。

     

src子目录通常包含多个版本控制   跟踪开发的存储库(例如Git或Mercurial)   一个或多个源包。

     

为了让您了解工作区在实践中的外观,这里是一个   例如:

bin/
    hello                          # command executable
    outyet                         # command executable
pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a           # package object
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
  hello/
      hello.go               # command source
  outyet/
      main.go                # command source
      main_test.go           # test source
  stringutil/
      reverse.go             # package source
      reverse_test.go        # test source
     

此工作空间包含一个包含两个的存储库(示例)   命令(hello和outyet)和一个库(stringutil)。

     

典型的工作区将包含许多包含的源存储库   许多包和命令。大多数Go程序员都保留他们的Go   单个工作区中的源代码和依赖项。

对于Go工具,Go包的所有Go源文件应该在同一目录中。

答案 1 :(得分:0)

这是故意的。 Go中的包使用目录路径导入。所以,“动物”和“动物/狗”是两个不同的包,即使你给它们相同的包名

为了证明这一点,我编写了以下示例文件集:

~/go/src/test/
├── animal
│   ├── animal.go
│   └── dog
│       └── dog.go
└── test.go

动物/ animal.go

package animal

type Species string

动物/狗/ dog.go

package animal

// In package "animal" importing a package "animal"
import "test/animal"

type Dog struct {
    Species animal.Species
    Breed   string
}

test.go

package main

import (
    "fmt"
    "test/animal/dog"
)

func main() {
    d := animal.Dog{}
    fmt.Printf("%#v", d)
}

请注意dog.go导入“test / animal”包并将其引用为“animal”。

另外请注意test.go导入“test / animal / dog”以访问“Dog”结构类型。如果它导入“test / animal”,则会生成错误(undefined:animal.Dog)。