2015-04-12 2 views
-3

У меня есть структура каталогов, как это:Пакет именование: ошибка экспорта переменной

Animal/ 
    dog/ 
    chiwawa.go 
    rabbit.go 

Оба chiwawa.go и rabbit.go упаковываются названы: «пакет животных» в верхней части файла. Однако, когда я пытаюсь использовать переменную var Food = apple от chiwawa.go в rabbit.go, я получаю ошибку - undefined: Food.

У меня нет проблем при размещении chiwawa.go непосредственно под Animal без каталога dog.

Является ли это намеренным в Go? Могу ли я обойти это, сохранив имена пакетов и структуру каталогов?

ответ

0

How to Write Go Code

Workspaces

Инструмент идти предназначен для работы с открытым исходным кодом, поддерживаемой в государственных хранилищах. Хотя вам не нужно публиковать свой код, модель для настройки среды работает одинаково, независимо от того, делаете ли вы или нет.

Код go должен храниться внутри рабочего пространства. Рабочая область представляет собой каталог иерархии с тремя каталогов в корне:

  • ЦСИ содержит Go исходных файлов, организованных в пакеты (один пакет на каталог),
  • упак содержит объекты пакета, и
  • бин содержит исполняемый команды.

Инструмент 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 

Это рабочее пространство содержит одно хранилище (пример), состоящий из двух команд (привет и outyet) и одна библиотека (StringUtil).

Типичное рабочее пространство будет содержать много исходных репозиториев, содержащих множество пакетов и команд. Большинство программистов Go сохраняют все свои исходные коды Go в одном рабочем пространстве.

Для инструментов Go все исходные файлы Go для пакета Go должны находиться в одном каталоге.

+0

Этот вопрос не имеет ничего общего с организацией рабочих мест. Кроме того, ваш пример отличается от того, который вы отправили в ссылках. – user3918985

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.go импортирует «тест/животное/собака», чтобы получить доступ к структуре структуры «Собака». Если он импортирует «test/animal», генерируется ошибка (undefined: animal.Dog).