2012-05-02 2 views
12

Я играю с Google Go, и мне весело (!), Но у меня проблемы с подсистемой пакета.Создайте и отправьте мой собственный локальный пакет в 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 

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

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

+0

что происходит? не могли бы вы быть более ясными, пожалуйста? успешно ли он компилируется? генерируется исполняемый файл? – Chaos

+0

нет, не сгенерирован исполняемый файл. no, no output message ... – gsscoder

ответ

9

Ответ на ваш вопрос: «Как мне это сделать?» объясняется в How to Write Go Code. Это действительно очень важный материал и является основой, которую вы должны иметь, прежде чем идти гораздо дальше.

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

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

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

+1

Я создал каталог под названием ** даже ** и переехал ** even.go ** внутри. Теперь я могу создать и запустить программу. Затем (для обучения) я переименовал ** даже ** в ** _ даже **. Исполняемый файл все еще работает, но когда я использую 'go run useeven.go', он терпит неудачу. Я думаю, что это доказательство того, что ** useeven ** executable содержит тогда модуль ** even.go **, встроенный в его образ бина. Я всегда читаю документы перед тем, как играть в код, но я новичок в этом языке, и в этом пункте docs (для меня) не совсем понятны. Возможно, чтобы получить некоторую какую-то _динамическую ссылку_ во время выполнения, нам нужно «перейти» к модулю. Это правильно? – gsscoder

+1

Нет. В любом случае, программы Go всегда статически связаны и нет возможности динамически связывать пакеты Go во время выполнения. 'go install' использует' GOPATH', как объясняется в документах, так что спецификаций файловой системы, таких как «./», можно избежать в пути импорта. – Sonia

+0

ОК, теперь этот момент ясен. В любом случае, я ожидаю, что этот язык будет расти. Я нашел его очень выразительным, ясным и синтетическим. Я надеюсь, что библиотека пакетов будет расширяться, чтобы расширить использование во все большем количестве полей. – gsscoder

2

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

Смежные вопросы