Go dilinde başka bir dosyadan fonksiyon nasıl çağırılır?


117

Go lang'daki başka bir dosyadan işlevi çağırmak istiyorum, herhangi biri yardımcı olabilir mi?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

Nasıl aramaya demoiçinde test2gelen test1?


Ne demek istiyorsun go fmt? Terminaldeki gibi mi yoksa ne? Bir şeye değer verdiğini nasıl gösteriyor?
Charlie Parker

Yanıtlar:


83

mainPaketinizde birden fazla olamaz .

Daha genel olarak, bir pakette belirli bir ada sahip birden fazla işleve sahip olamazsınız.

Kaldır mainin test2.gove uygulamayı derlemek. demoİşlevi görünür olacaktır test1.go.


1
mainTest2.go'da kaldırdıktan sonra derleyip çalıştırabilirim ancak go run test1.gohala kullanarak test1.go'yu çalıştırmada başarısız oldum . Neden ?
Jeff Li

90
go run test1.go test2.go
Rich Churcher

2
@RichChurcher, cevabı verdin. Teşekkürler . Ayrıca Demo () büyük
harfle yazmalısınız

Test2'nin bir yapısı varsa, bu da içeri aktarılır mı?
Angger

@RaymondChenon Büyük harf yalnızca bir işlevin farklı bir pakette kullanılması gerektiğinde gereklidir. Bu durumda, her iki dosya da aynı pakette 'ana' olduğundan, 'dışa aktarılmamış' (özel okuma) işlevlerine de erişebilirler. Bkz tour.golang.org/basics/3
Tanışma Sinojia

58

Varsayılan olarak Go Lang, yalnızca belirtilen dosyayı oluşturur / çalıştırır. Tüm dosyaları bağlamak için, çalışırken tüm dosyaların adını belirtmeniz gerekir.

Aşağıdaki iki komuttan birini çalıştırın:

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

Onları inşa etmek istiyorsanız benzer bir şey yapmalısınız.


1
go run *.gotemiz. İhtiyacım olan buydu
Alif Ramdani

1. komut benim için çalıştı
James Christian Kaguo

42

Ben de aynı şeyi arıyordum. " Test1'den test2'de demo nasıl aranır? " Sorunuzu yanıtlamak için , işte bunu yaptım. Bu kodu go run test1.gokomutla çalıştırın . Değişim current_folder için klasör test1.go nerede.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Test2.go dosyasını alt klasöre koyun lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}

6
Yöntem adının büyük harfle yazıldığından emin olun, aksi takdirde işe yaramaz.
Maksimum

1
Çözümünüz için teşekkür ederim, bana çok yardımcı oldu! :)
jenkizenki

Üzgünüz ama bu açıkça çalışmıyor:package lib; expected main
Madeo

Klasör yapısı burada bir rol oynar.
Bill Zelenko

1
Klasör Yapısı

çiftleme
  |
  | --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

0

Sadece çalıştırırsanız go run test1.gove bu dosyanın aynı paketteki başka bir dosyadaki bir işleve referansı varsa, Go'ya tüm paketi çalıştırmasını söylemediğinizden, yalnızca o dosyayı çalıştırmasını söylediğiniz için hata verecektir.

Dosyaları birkaç yolla çalıştırmada bir paket olarak gruplandırarak go'nun bütün bir paket olarak çalışmasını söyleyebilirsiniz. İşte bazı örnekler (eğer terminaliniz paketinizin dizinindeyse):

go run ./

VEYA

go run test1.go test2.go

VEYA

go run *.go

Build komutunu kullanarak aynı davranışı bekleyebilirsiniz ve oluşturulan yürütülebilir dosyayı çalıştırdıktan sonra, dosyaların diğer işlevler hakkında bilgi sahibi olduğu gruplanmış bir paket olarak çalışacaktır. Örnek:

go build ./

VEYA

go build test1.go test2.go

VEYA

go build *.go

Ve daha sonra, komut satırından çalıştırılabilir dosyayı çağırmak, tüm dosyaları bir bütün olarak birlikte çalıştırdığınızda çalıştır komutunu kullanmaya benzer bir çıktı verecektir. Ör:

./test1

Veya çalıştırılabilir dosya adınız oluşturulduğunda çağrılırsa.


0

İşlevsel, nesnel, basit ve hızlı bir örnek:

main.go

package main

import "pathToProject/controllers"

func main() {
    controllers.Test()
}

control.go

package controllers

func Test() {
// Do Something
}

Unutmayın: Görünür Dış Fonksiyonlar, Değişkenler ve Yöntemler Büyük Harf ile başlar.

yani:

func test() {
    // I am not Visible outside the file
}
 
func Test() {
    // I am VISIBLE OUTSIDE the FILE
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.