Chcę wywołać funkcję z innego pliku w go lang, czy ktoś może pomóc?
test1.go
package main
func main() {
demo()
}
test2.go
package main
import "fmt"
func main() {
}
func demo() {
fmt.Println("HI")
}
Jak nazywają demo
się test2
od test1
?
go fmt
? Jak w terminalu czy co? Jak to pokazuje, że mu na czymś zależy?Odpowiedzi:
Nie możesz mieć więcej niż jednego
main
w swojej paczce.Mówiąc bardziej ogólnie, nie możesz mieć więcej niż jednej funkcji o podanej nazwie w pakiecie.
Usuń
main
intest2.go
i skompiluj aplikację.demo
Funkcja będzie widocznetest1.go
.źródło
main
w test2.go, ale nie udało mi się uruchomić test1.go przy użyciugo run test1.go
still. Czemu ?go run test1.go test2.go
Go Lang domyślnie buduje / uruchamia tylko wspomniany plik. Aby połączyć wszystkie pliki, musisz określić nazwy wszystkich plików podczas działania.
Uruchom jedno z poniższych dwóch poleceń:
$go run test1.go test2.go. //order of file doesn't matter $go run *.go
Powinieneś zrobić podobnie, jeśli chcesz je zbudować.
źródło
go run *.go
czysty. Tego właśnie potrzebowałemSzukałem tego samego. Odpowiadając na pytanie „ Jak wywołać demo w test2 z test1? ”, Oto sposób, w jaki to zrobiłem. Uruchom ten kod za pomocą
go run test1.go
polecenia. Zmień bieżący_folder na folder, w którym znajduje się test1.go.test1.go
package main import ( L "./lib" ) func main() { L.Demo() }
lib \ test2.go
Umieść plik test2.go w podfolderze
lib
package lib import "fmt" // This func must be Exported, Capitalized, and comment added. func Demo() { fmt.Println("HI") }
źródło
package lib; expected main
Jeśli po prostu uciekniesz
go run test1.go
i ten plik ma odniesienie do funkcji w innym pliku w tym samym pakiecie, wystąpi błąd, ponieważ nie powiedziałeś Go, aby uruchomił cały pakiet, powiedziałeś, że ma uruchamiać tylko ten jeden plik.Możesz powiedzieć go, aby działał jako cały pakiet, grupując pliki jako pakiet w przebiegu na kilka sposobów. Oto kilka przykładów (jeśli twój terminal znajduje się w katalogu twojego pakietu):
go run ./
LUB
go run test1.go test2.go
LUB
go run *.go
Możesz spodziewać się takiego samego zachowania przy użyciu polecenia build, a po uruchomieniu utworzony plik wykonywalny będzie działał jako zgrupowany pakiet, gdzie pliki wiedzą o swoich funkcjach itp. Przykład:
go build ./
LUB
go build test1.go test2.go
LUB
go build *.go
Następnie po prostu wywołanie pliku wykonywalnego z wiersza poleceń da podobne wyniki, jak użycie polecenia uruchom, gdy uruchomiłeś wszystkie pliki razem jako cały pakiet. Dawny:
./test1
Lub jakakolwiek nazwa Twojego pliku wykonywalnego zostanie wywołana podczas jego tworzenia.
źródło
duplicate_main.go
package main import ( "fmt" "os" ) func main() { counts := make(map[string]int) files := os.Args[1:] if len(files) == 0 { countLines(os.Stdin, counts) } else { for _, arg := range files { f, err := os.Open(arg) if err != nil { fmt.Fprintf(os.Stderr, "dup2: %v\n", err) continue } countLines(f, counts) f.Close() } } for line, n := range counts { if n > 1 { fmt.Printf("%d\t%s\n", n, line) } } }
countLines.go
package main import ( "bufio" "os" ) func countLines(f *os.File, counts map[string]int) { input := bufio.NewScanner(f) for input.Scan() { counts[input.Text()]++ } }
go run ch1_dup2.go countLines.go abc.txt
go run *.go abc.txt
go build ./
go build ch1_dup2.go countLines.go
go build *.go
źródło