Подтвердить что ты не робот

Создайте и укажите мой собственный локальный пакет в Go

Я играю с Google Go, и мне весело (!), но у меня возникают проблемы с подсистемой пакета.

Я запускаю Go 1.0.1 в Mac OS X Lion. Я также создаю различные программные файлы без проблем (я также создаю небольшой webapp, используя html/templates без проблем, и он компилируется и запускается без каких-либо ошибок).

Я определил пакет "повторно используемый" (even.go):

package even

func Even(i int) bool {
    return i % 2 == 0
}

func Odd(i int) bool {
    return i % 2 == 1
}

и потребительской программы (useeven.go):

package main

import (
    "./even"
    "fmt"
)

func main() {
    a := 5
    b := 6

    fmt.Printf("%d is even %v?\n", a, even.Even(a))
    fmt.Printf("%d is odd %v?\n", b, even.Odd(b))
}

Но когда я компилирую "библиотеку" с помощью

go build even.go

У меня ничего нет... Нет ошибок, нет сообщений... Что происходит?

Как мне это сделать?

4b9b3361

Ответ 1

Ответ на ваш вопрос "Как мне это сделать?" объясняется в разделе Как написать код Go. Это действительно очень важный материал, на который стоит взглянуть.

Поведение go build может показаться странным, но на самом деле это обычное явление для программ командной строки - отсутствие вывода означает, что программа успешно запущена. Так, что это сделало? Для этого ваш ответ в go help build

... В противном случае build компилирует пакеты, но отбрасывает результаты, служа только для проверки возможности сборки пакетов.

Что, ты хотел большего? Конечно. "Как написать код Go" объясняет хорошие способы сделать это. Для быстрого исправления вашей программы я объясню, что команда go ожидает, что каждый пакет и каждая исполняемая программа будут находиться в отдельном каталоге. Если вы просто создаете каталог с именем even, сразу в папке useeven.go, и перемещаете в него even.go, тогда go run useeven.go должен работать так же, как он у вас есть.

Ответ 2

go build генерирует только выходной файл, когда он создает "единственный основной пакет". Если вы хотите вывести файл для другого пакета, вы должны использовать go install. Это создаст и установит этот пакет в ваш каталог pkgs.

Ответ 3

Причина, по которой вывод не генерируется здесь, заключается в том, что вы запускаете

go build even.go

команда на пакет, а не основной файл go. В этом случае пакет будет проверять наличие ошибок в пакете, но поскольку он не является основным с выводом, сообщения об успехе не будут генерироваться. Если есть проблемы с содержимым пакета, будут отображаться ошибки, в противном случае, если он скомпилируется нормально , вывод не будет

Вместо этого вы должны запустить:

go build useeven.go

Чтобы создать двоичный файл, затем выполнить двоичный файл и получить выходные данные из программы:

./useeven

Ответ 4

Как отмечается в комментарии OP, go build and go run useeven.go отлично работает, как только ты положил even.go в свою собственную папку: ./even/even.go. В ./ (при импорте) есть немного магии Go, которая автоматически собирает "локальный пакет", не требуя его установки в любом месте.

useeven/
├── even
│   └── even.go
└── useeven.go

Если вы хотите сделать эту работу без магии ./, то библиотека должна быть установлена. Быстрый и грязный способ (рискуя загрязнить пространство имен вашей библиотеки) выполнения этой работы для вашего проекта состоит в том, чтобы просто зарегистрировать исходное местоположение библиотеки, используя символическую ссылку, например, так (в этом примере GOPATH - ~/go):

[ useeven ]
$ ln -s $(pwd)/even ~/go/src

Теперь, когда вы строите программу, она автоматически выполняет go get even установить последнюю последнюю версию библиотеки.

Обратите внимание, что это не заставляет go install * работать с библиотекой, а просто делает это ненужным.


Есть более идиоматические способы сделать это, если вы не спешите: как импортировать локальные пакеты в go?