2012-05-02 7 views
12

Estoy jugando con Google Go y me estoy divirtiendo (!), Pero tengo algunos problemas con el subsistema del paquete.Cree y haga referencia a mi propio paquete local en Go

Estoy ejecutando Go 1.0.1 en Mac OS X Lion. También he creado varios programas de archivos únicos sin problemas (también he compilado una pequeña aplicación web usando html/templates sin problemas y se compila y se ejecuta sin ningún error).

he definido un paquete de "reutilizable" (even.go):

package even 

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

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

y un programa de consumo (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)) 
} 

Pero cuando compilo la "biblioteca "usando

go build even.go 

no tengo nada ... no hay errores, ningún mensaje ... ¿Qué ocurre?

¿Cómo debo hacer esto?

+0

¿Qué sucede entonces? podrías ser mas claro por favor? se compila con éxito? es el ejecutable generado? – Chaos

+0

no, no se ha generado ningún ejecutable. no, no hay mensaje de salida ... – gsscoder

Respuesta

9

La respuesta a su pregunta, "¿Cómo debo hacer esto?" se explica en How to Write Go Code. Es realmente algo muy importante y es una base que debes tener antes de ir mucho más allá.

El comportamiento de go build puede parecer desconcertante, pero en realidad es algo convencional para los programas de línea de comandos: ninguna salida significa que el programa se ejecutó correctamente. Entonces, ¿qué hizo? Para eso puedes leer los documentos. go help build explica,

... De lo contrario la acumulación compila los paquetes, pero descarta los resultados, sólo sirve como una verificación de que los paquetes se pueden construir.

¿Qué, usted quería más? Por supuesto. "Cómo escribir el código Go" explica las buenas maneras de hacerlo. Para una solución rápida a su programa, explicaré que el comando go espera que cada paquete y cada programa ejecutable estén en un directorio separado. Si acaba de hacer un directorio llamado par, inmediatamente debajo de la ubicación de useeven.go, y mueve even.go a él, entonces go run useeven.go debería ejecutarse tal como lo tiene.

+1

He creado un directorio llamado ** incluso ** y movido ** even.go ** dentro. Ahora puedo construir y ejecutar el programa. Luego (para aprender) he cambiado el nombre ** incluso ** a ** _ incluso **. El ejecutable sigue funcionando pero cuando uso 'go run useeven.go' falla. Creo que esto es una evidencia de que el ejecutable ** useeven ** contiene el módulo ** even.go ** incrustado en su imagen bin. Siempre leo documentos antes de ir a jugar código, pero soy nuevo en este lenguaje y en este punto los documentos (para mí) no son muy claros. Quizás para obtener algún tipo de enlace _dynamic_ en tiempo de ejecución, necesitamos 'ir a instalar' el módulo. ¿Es correcto? – gsscoder

+1

No. Actualmente, de todos modos, los programas Go siempre están vinculados estáticamente y no hay forma de tener paquetes Go vinculados dinámicamente en tiempo de ejecución. 'go install' usa' GOPATH', como se explica en los documentos, de modo que las especificaciones del sistema de archivos como "./" se pueden evitar en las rutas de importación. – Sonia

+0

Bien, ahora este punto es claro. De todos modos, espero que este idioma crezca. Lo encontré muy expresivo, claro y sintético. Espero que la biblioteca de paquetes crezca para extender el uso en más y más campos. – gsscoder

2

go build solo genera un archivo de salida cuando crea un "único paquete principal". Si desea generar un archivo para su otro paquete, debe usar go install. Eso construirá e instalará ese paquete en su directorio pkgs.

Cuestiones relacionadas