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

150

Actualmente tengo un solo archivo en mi paquete principal llamado main.go. ¿Cómo divido el contenido de main.goen múltiples archivos sin crear un paquete separado porque el código no es reutilizable?

Quiero una estructura de directorio como esta:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Entonces en main.go

package main

func main() {
    Bar()
}

Pero go run main.gome da:

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

Respuestas:

204

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

go run .

Respuesta original

El código anterior realmente funciona. El problema era que necesitaba correr

go run *.go

en vez de

go run main.go
Neil
fuente
66
A menos que tenga *_test.goen su carpeta. Entonces necesitas (1) shopt -s ext globy (2) go run !(*_test).go.
getWeberForStackExchange
¿Y los que usan appengine?
goodies4uall
Lo intenté go run ./cmd/myCmd/...y funcionó para mí. Tal vez esta es la forma correcta cuando hay _test.goarchivos?
VinGarcia
go run ../your_folderdesde el interior de la carpeta de trabajo me funciona
Andy
3
Just dogo run .
BarthesSimpson
66

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 solo 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 el programa Go que consta de varios archivos? ", go runEspera una lista de archivos, ya que "compila y ejecuta el mainpaquete que comprende los archivos de origen Go".
Así que ciertamente puedes dividir tu mainpaquete en varios archivos congo run .

Eso difiere de lo go build/go installque esperan los nombres de paquete (y no los nombres de archivo).
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 hace la expansión comodín .

VonC
fuente
1
¿Existe una solución alternativa para ejecutar múltiples archivos go con runel símbolo del sistema de Windows?
Lucas
1
¡Gracias! Esto me ayudó mucho. Me preguntaba por qué no podía ejecutar el código solo con main.go, ya que era el mismo paquete, pero tiene sentido para mí por qué no lo permitieron.
Chris
5

Como se mencionó, puede decir, go run *.gopero para Windows solo puede enumerar los archivos de script (ya que * .go no funcionará):go run main.go other.go third.go

Karl Penzhorn
fuente
Si eso es correcto. En Windows tuve que corrergo run .
KTM hace
3

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

Solo ejecuta esto:

go run .

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

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

Felicitaciones a @BarthesSimpson

chim
fuente
0

Para Windows, instale Cygwin y utilícelo en lugar del símbolo del sistema. "go run * .go" funcionará entonces.

Alex Dvoretskiy
fuente
Sugeriría MinGW para eso, pero el enfoque es correcto si me preguntas. Dudo que alguien pueda estar realmente apegado emocionalmentecmd.exe
Aleksandr Kravets
0

Si está intentando ejecutar múltiples archivos en localhost usando gorilla mux en go según la última versión (1.11). Intente usar cualquiera de los siguientes 2 comandos.

  1. vaya a instalar && FolderName -port 8081.

  2. vaya a construir && ./FolderName -port 8081.

Asegúrese de estar en la carpeta de origen, es decir, vaya / src / FolderName antes de ejecutar el comando en la Terminal.

Bharath Kuppala
fuente