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?

Yves M.
źródło
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.

Denys Séguret
źródło
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ć.

rai.skumar
źródło
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")
}
Bill Zelenko
źródło
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.

kiko carisse
źródło
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
Suvodeep Dubey
źródło