¿Cómo llamar a la función desde otro archivo en el idioma go?

109

Quiero llamar a la función desde otro archivo en go lang, ¿alguien puede ayudar?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

func demo() {
    fmt.Println("HI")
}

Como llamar demoen test2partir test1?

Yves M.
fuente
¿Qué quieres decir con go fmt? ¿Como en la terminal o qué? ¿Cómo demuestra que le importa algo?
Charlie Parker

Respuestas:

78

No puede tener más de uno mainen su paquete.

De manera más general, no puede tener más de una función con un nombre de pila en un paquete.

Quita el mainin test2.goy compila la aplicación. La demofunción será visible desde test1.go.

Denys Séguret
fuente
1
Puedo compilar y ejecutar después de eliminar mainen test2.go pero no pude ejecutar test1.go usando go run test1.gostill. Por qué ?
Jeff Li
88
go run test1.go test2.go
Rich Churcher
2
@RichChurcher, diste la respuesta. Gracias . También debe usar Demo () en mayúsculas , las funciones públicas están en mayúsculas por convención
Raymond Chenon
Si test2 tiene una estructura, ¿se importará también?
Angger
@RaymondChenon Solo se requieren mayúsculas cuando una función debe usarse en un paquete diferente. En este caso, dado que ambos archivos están en el mismo paquete 'principal', también pueden acceder a funciones 'no exportadas' (leer privadas). Ver tour.golang.org/basics/3
Conoce a Sinojia el
51

Go Lang por defecto construye / ejecuta solo el archivo mencionado. Para vincular todos los archivos, debe especificar el nombre de todos los archivos mientras se ejecuta.

Ejecute cualquiera de los dos comandos siguientes:

$go run test1.go test2.go. //order of file doesn't matter
$go run *.go

Debería hacer algo similar, si quiere construirlos.

rai.skumar
fuente
38

Yo buscaba lo mismo. Para responder a su pregunta " ¿Cómo llamar a la demostración en test2 desde test1? ", Esta es la forma en que lo hice. Ejecute este código con el go run test1.gocomando. Cambie current_folder a la carpeta donde está test1.go.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Coloque el archivo test2.go en la subcarpeta lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
Bill Zelenko
fuente
5
Asegúrese de que el nombre del método esté en mayúsculas, de lo contrario no funcionará.
Max
1
Gracias por tu solución, ¡me ayudó mucho! :)
jenkizenki
Lo siento, pero esto claramente no funciona:package lib; expected main
Madeo
0

Si solo corres go run test1.go y ese archivo tiene una referencia a una función en otro archivo dentro del mismo paquete, se producirá un error porque no le dijo a Go que ejecutara todo el paquete, le dijo que solo ejecutara ese archivo.

Puede indicar que go se ejecute como un paquete completo agrupando los archivos como un paquete en la ejecución con comas de varias formas. Aquí hay algunos ejemplos (si su terminal está en el directorio de su paquete):

go run ./

O

go run test1.go test2.go

O

go run *.go

Puede esperar el mismo comportamiento usando el comando de compilación, y después de ejecutar el ejecutable creado se ejecutará como un paquete agrupado, donde los archivos conocen las funciones de los demás, etc. Ejemplo:

go build ./

O

go build test1.go test2.go

O

go build *.go

Y luego, simplemente llamar al ejecutable desde la línea de comando le dará una salida similar a usar el comando de ejecución cuando ejecutó todos los archivos juntos como un paquete completo. Ex:

./test1

O cualquiera que sea el nombre de su archivo ejecutable cuando se creó.

kiko carisse
fuente