Jak wywołać funkcję z innego pliku w języku go?


113

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ą demosię test2od test1?


Co masz na myśli go fmt? Jak w terminalu czy co? Jak to pokazuje, że mu na czymś zależy?
Charlie Parker

Odpowiedzi:


84

Nie możesz mieć więcej niż jednego mainw swojej paczce.

Mówiąc bardziej ogólnie, nie możesz mieć więcej niż jednej funkcji o podanej nazwie w pakiecie.

Usuń mainin test2.goi skompiluj aplikację. demoFunkcja będzie widoczne test1.go.


1
Mogę budować i uruchamiać po usunięciu mainw test2.go, ale nie udało mi się uruchomić test1.go przy użyciu go run test1.gostill. Czemu ?
Jeff Li,

89
go run test1.go test2.go
Rich Churcher,

2
@RichChurcher, dałeś odpowiedź. Dzięki . Ponadto należy wielkimi literami Demo () , funkcje publiczne są obudowane górna umownie
Raymond Chenon

Jeśli test2 ma strukturę, czy będzie również importowany?
Angger

@RaymondChenon Wielkie litery są wymagane tylko wtedy, gdy funkcja musi być używana w innym pakiecie. W tym przypadku, ponieważ oba pliki znajdują się w tym samym pakiecie „main”, mogą również uzyskać dostęp do funkcji „nieeksportowanych” (do odczytu prywatnego). Zobacz tour.golang.org/basics/3
Poznaj Sinojię

56

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ć.


1
go run *.goczysty. Tego właśnie potrzebowałem
Alif Ramdani

39

Szukał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.gopolecenia. 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")
}

5
Upewnij się, że nazwa metody jest zapisana wielkimi literami, w przeciwnym razie nie zadziała.
Max

1
Dziękuję za rozwiązanie, bardzo mi pomogło! :)
jenkizenki

Przepraszamy, ale to najwyraźniej nie działa:package lib; expected main
Madeo

Struktura folderów odgrywa tutaj rolę.
Bill Zelenko

0

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.


0
Struktura folderów

duplikować
  |
  | --duplicate_main.go
  |
  | --countLines.go
  |
  | --abc.txt

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()]++
        }
    }
  1. go run ch1_dup2.go countLines.go abc.txt
  2. go run *.go abc.txt
  3. go build ./
  4. go build ch1_dup2.go countLines.go
  5. go build *.go
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.