¿Cómo puedo "ejecutar" un proyecto con varios archivos en el paquete principal?

Resuelto Neil asked hace 9 años • 9 respuestas

Tengo un único archivo en el mainpaquete llamado main.go. Como el código no es reutilizable, quiero separar parte del código en un archivo diferente pero en el mismo paquete.

¿Cómo divido el contenido main.goen varios archivos sin crear un paquete separado?

Quiero una estructura de directorio como esta:

ls foo

# output:
main.go
bar.go

Archivobar.go

// file bar.go
package main

import "fmt"

func Bar() {
  fmt.Println("Bar")
}

Archivomain.go

// file main.go
package main

func main() {
  Bar()
}

En main.goquiero usar func Bar()desde bar.go. Pero cuando lo ejecuto go run main.goresulta en:

# command-line-arguments
./main.go:4:2: undefined: Bar

¿Qué se puede hacer para ejecutar el código sin error?

Neil avatar Jan 22 '15 11:01 Neil
Aceptado

Actualización 26 de julio de 2019 (para ir >=1.11)

go run .

También funcionará en Windows.

Respuesta original (para entornos que no son Windows)

El código realmente funciona. El problema era que en lugar de ejecutar go run main.godebería ejecutar:

go run *.go
Neil avatar Jan 22 '2015 04:01 Neil

Actualización de agosto de 2018, con Go 1.11 , una sección "Ejecutar" dice:

El go runcomando ahora permite una única ruta de importación, un nombre de directorio o un patrón que coincida con un único paquete.
Esto permite go run pkgo go run dir, lo más importantego run .


Respuesta original de enero de 2015.

Como se menciona en "¿ Cómo compilar un programa Go que consta de varios archivos? ", go runespera una lista de archivos, ya que "compila y ejecuta el mainpaquete que comprende los archivos fuente de Go nombrados".
Así que ciertamente puedes dividir tu mainpaquete en varios archivos con go run.

Eso difiere de go build/go installlo que se esperan nombres de paquetes (y no nombres de archivos).
Un simple go buildproduciría un ejecutable con el nombre de la carpeta principal.

Tenga en cuenta que, como se ilustra en este hilo , a go run *.gono funcionaría en una sesión CMD de Windows, ya que el shell no realiza expansión con comodines .

VonC avatar Jan 22 '2015 06:01 VonC

En mi opinión, la mejor respuesta a esta pregunta está oculta en los comentarios de la respuesta principal.

Simplemente ejecuta esto:

go run .

Esto ejecutará todos los archivos en el paquete principal, pero no mostrará un mensaje de error como

go run: cannot run *_test.go files (main_test.go)

Felicitaciones a @BarthesSimpson

chim avatar Jul 26 '2019 10:07 chim