2012-05-02 11 views
12

Sto giocando con Google Go e mi sto divertendo (!), Ma sto riscontrando qualche problema con il sottosistema dei pacchetti.Costruisci e fai riferimento al mio pacchetto locale in Go

Sono in esecuzione Vai 1.0.1 su Mac OS X Lion. Ho anche creato vari programmi per singoli file senza problemi (ho anche creato una piccola webapp usando html/templates senza problemi e si compila e funziona senza errori).

ho definito un pacchetto "riutilizzabile" (even.go):

package even 

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

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

e un programma per i consumatori (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)) 
} 

Ma quando compilo il "biblioteca "using

go build even.go 

Non ho ottenuto nulla ... Nessun errore, nessun messaggio ... Che succede?

Come devo fare?

+0

cosa succede allora? potresti essere più chiaro per favore? si compila con successo? è l'eseguibile generato? – Chaos

+0

no, nessun file eseguibile generato. no, nessun messaggio di output ... – gsscoder

risposta

9

La risposta alla tua domanda, "Come devo fare?" è spiegato in How to Write Go Code. È roba davvero piuttosto importante ed è una base che dovresti avere prima di andare molto oltre.

Il comportamento di go build potrebbe sembrare sconcertante, ma in realtà è convenzionale per i programmi della riga di comando: nessun output significa che il programma è stato eseguito correttamente. Quindi cosa ha fatto? Per quello puoi leggere i documenti. go help build spiega,

... Altrimenti accumulo compila i pacchetti, ma scarta i risultati, serve solo come verifica che i pacchetti possono essere costruite.

Cosa, volevi di più? Ovviamente. "How to Write Go Code" spiega i buoni modi per farlo. Per una rapida soluzione al tuo programma, ti spiegherò che il comando go prevede che ogni pacchetto e ciascun programma eseguibile si trovino in una directory separata. Se crei una directory chiamata even, immediatamente sotto la posizione di useeven.go e sposta even.go su di essa, allora go run useeven.go dovrebbe essere eseguito esattamente come lo hai tu.

+1

Ho creato una directory chiamata ** even ** e spostata ** even.go ** all'interno. Ora posso creare ed eseguire il programma. Quindi (per scopo didattico) ho rinominato ** even ** to ** _ even **. L'eseguibile funziona ancora ma quando uso 'go run useeven.go' fallisce. Penso che questo sia una prova che l'eseguibile ** useeven ** contiene quindi il modulo ** even.go ** incorporato nella sua immagine bin. Leggo sempre i documenti prima di andare a giocare a codice, ma sono nuovo in questa lingua e in questo punto i documenti (per me) non sono chiari. Forse per ottenere qualche tipo di _dynamic link_ in fase di esecuzione, dobbiamo 'andare installare 'il modulo. È giusto? – gsscoder

+1

No. Al momento, i programmi Go sono sempre collegati staticamente e non è possibile avere pacchetti Go collegati dinamicamente in fase di esecuzione. 'go install' usa' GOPATH', come spiegato nei documenti, in modo che le specifiche del file system come "./" possano essere evitate nei percorsi di importazione. – Sonia

+0

OK, ora questo punto è chiaro. Ad ogni modo mi aspetto che questa lingua cresca. L'ho trovato molto espressivo, chiaro e sintetico. Spero che la libreria dei pacchetti cresca per estendere l'utilizzo in sempre più campi. – gsscoder

2

go build genera un file di output solo quando crea un "pacchetto principale singolo". Se vuoi stampare un file per il tuo altro pacchetto dovresti usare go install. Ciò creerà e installerà quel pacchetto nella tua directory pkgs.

Problemi correlati