Bagaimana cara memanggil fungsi dari file lain dalam bahasa go?

113

Saya ingin memanggil fungsi dari file lain di go lang, dapatkah ada yang membantu?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

Bagaimana memanggil demodi test2dari test1?

Yves M.
sumber
Apa yang Anda maksud dengan go fmt? Seperti di terminal atau apa? Bagaimana itu menunjukkan bahwa dia peduli tentang apapun?
Charlie Parker

Jawaban:

84

Anda tidak boleh memiliki lebih dari satu maindalam paket Anda.

Secara umum, Anda tidak dapat memiliki lebih dari satu fungsi dengan nama tertentu dalam sebuah paket.

Hapus maindalam test2.godan kompilasi aplikasi. The demofungsi akan terlihat dari test1.go.

Denys Séguret
sumber
1
Saya dapat membangun dan menjalankan setelah menghapus maindi test2.go tetapi gagal menjalankan test1.go menggunakan go run test1.gomasih. Kenapa?
Jeff Li
89
go run test1.go test2.go
Rich Churcher
2
@RichChurcher, Anda memberikan jawabannya. Terima kasih. Anda juga harus menggunakan huruf besar Demo () , fungsi publik menggunakan huruf besar berdasarkan konvensi
Raymond Chenon
Jika test2 memiliki struct, apakah akan diimpor juga?
Angger
@RaymondChenon Huruf besar hanya diperlukan jika fungsi perlu digunakan dalam paket yang berbeda. Dalam kasus ini, karena kedua file berada dalam paket 'utama' yang sama, mereka juga dapat mengakses fungsi 'non-diekspor' (baca pribadi). Lihat tour.golang.org/basics/3
Bertemu Sinojia
56

Go Lang secara default membangun / hanya menjalankan file yang disebutkan. Untuk menautkan semua file, Anda perlu menentukan nama semua file saat menjalankan.

Jalankan salah satu dari dua perintah di bawah ini:

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

Anda harus melakukan hal serupa, jika Anda ingin membangunnya.

rai.skumar
sumber
1
go run *.gobersih. Itulah yang saya butuhkan
Alif Ramdani
40

Saya mencari hal yang sama. Untuk menjawab pertanyaan Anda " Bagaimana cara memanggil demo di test2 dari test1? ", Inilah cara saya melakukannya. Jalankan kode ini dengan go run test1.goperintah. Ubah current_folder ke folder tempat test1.go berada.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Letakkan file test2.go di subfolder lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
Bill Zelenko
sumber
6
Pastikan nama metode dikapitalisasi, jika tidak maka tidak akan berfungsi.
Maksimal
1
Terima kasih atas solusinya, ini sangat membantu saya! :)
jenkizenki
Maaf, tapi ini jelas tidak berhasil:package lib; expected main
Madeo
Struktur folder berperan di sini.
Bill Zelenko
0

Jika Anda baru saja menjalankan go run test1.godan file itu memiliki referensi ke suatu fungsi di file lain dalam paket yang sama, ini akan error karena Anda tidak memberi tahu Go untuk menjalankan seluruh paket, Anda menyuruhnya untuk hanya menjalankan satu file itu.

Anda dapat membedakan go to run sebagai keseluruhan paket dengan mengelompokkan file sebagai paket dalam menjalankan commaned dengan beberapa cara. Berikut ini beberapa contoh (jika terminal Anda ada di direktori paket Anda):

go run ./

ATAU

go run test1.go test2.go

ATAU

go run *.go

Anda dapat mengharapkan perilaku yang sama menggunakan perintah build, dan setelah menjalankan executable yang dibuat akan berjalan sebagai paket yang dikelompokkan, di mana file mengetahui tentang fungsi masing-masing, dll. Contoh:

go build ./

ATAU

go build test1.go test2.go

ATAU

go build *.go

Dan kemudian setelah itu hanya memanggil yang dapat dieksekusi dari baris perintah akan memberi Anda output yang mirip dengan menggunakan perintah run ketika Anda menjalankan semua file bersama sebagai satu paket keseluruhan. Ex:

./test1

Atau apa pun nama file Anda yang dapat dieksekusi dipanggil saat dibuat.

kiko carisse
sumber
0
Struktur Folder

duplikat
  |
  | --duplicate_main.go
  |
  | --countLines.go
  |
  | --abc.txt

duplikat_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
sumber