จะเรียกใช้ฟังก์ชันจากไฟล์อื่นในภาษา go ได้อย่างไร?


113

ฉันต้องการเรียกใช้ฟังก์ชันจากไฟล์อื่นใน go lang มีใครช่วยได้ไหม

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

จะโทรdemoเข้าtest2จากtest1อย่างไร?


คุณหมายถึงgo fmtอะไร? เช่นในเทอร์มินัลหรืออะไร? มันแสดงให้เห็นอย่างไรว่าเขาสนใจอะไร?
Charlie Parker

คำตอบ:


84

คุณไม่สามารถมีมากกว่าหนึ่งรายการmainในแพ็กเกจของคุณ

โดยทั่วไปคุณไม่สามารถมีมากกว่าหนึ่งฟังก์ชันที่มีชื่อที่กำหนดในแพ็กเกจ

ลบmainอินtest2.goและคอมไพล์แอปพลิเคชัน ฟังก์ชั่นจะมองเห็นได้จากdemotest1.go


1
ฉันสามารถสร้างและเรียกใช้หลังจากลบmainใน test2.go แต่ไม่สามารถเรียกใช้ test1.go โดยใช้go run test1.goภาพนิ่ง ทำไม?
Jeff Li

89
go run test1.go test2.go
Rich Churcher

2
@RichChurcher คุณให้คำตอบ ขอบคุณ. นอกจากนี้คุณควรใช้ตัวพิมพ์ใหญ่Demo ()ฟังก์ชั่นสาธารณะเป็นส่วนบนโดยการประชุม
Raymond Chenon

ถ้า test2 มีโครงสร้างจะนำเข้าด้วยหรือไม่?
Angger

@RaymondChenon Upper case จำเป็นต้องใช้เฉพาะเมื่อต้องใช้ฟังก์ชันในแพ็คเกจอื่น ในกรณีนี้เนื่องจากไฟล์ทั้งสองอยู่ในแพ็กเกจ 'หลัก' เดียวกันจึงสามารถเข้าถึงฟังก์ชัน 'ไม่ส่งออก' (อ่านส่วนตัว) ได้เช่นกัน ดูtour.golang.org/basics/3
พบกับ Sinojia

56

ไป Lang ตามค่าเริ่มต้นสร้าง / รันเฉพาะไฟล์ที่กล่าวถึง ในการเชื่อมโยงไฟล์ทั้งหมดคุณต้องระบุชื่อไฟล์ทั้งหมดในขณะที่รัน

เรียกใช้คำสั่งอย่างใดอย่างหนึ่งจากสองคำสั่งด้านล่าง:

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

คุณควรทำสิ่งที่คล้ายกันหากคุณต้องการสร้างมัน


1
go run *.goสะอาด. นั่นคือสิ่งที่ฉันต้องการ
Alif Ramdani

40

ฉันกำลังมองหาสิ่งเดียวกัน หากต้องการตอบคำถามของคุณ " จะโทรสาธิตใน test2 จาก test1 ได้อย่างไร " นี่คือวิธีที่ฉันทำ รันโค้ดนี้ด้วยgo run test1.goคำสั่ง เปลี่ยนcurrent_folderเป็นโฟลเดอร์ที่ test1.go อยู่

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

ใส่ไฟล์ test2.go ในโฟลเดอร์ย่อย lib

package lib

import "fmt"

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

6
ตรวจสอบว่าชื่อเมธอดเป็นตัวพิมพ์ใหญ่มิฉะนั้นจะใช้ไม่ได้
สูงสุด

1
ขอบคุณสำหรับวิธีแก้ปัญหามันช่วยฉันได้มาก! :)
jenkizenki

ขออภัย แต่สิ่งนี้ไม่ได้ผลอย่างชัดเจน:package lib; expected main
Madeo

โครงสร้างโฟลเดอร์มีบทบาทที่นี่
Bill Zelenko

0

หากคุณเพิ่งเรียกใช้go run test1.goและไฟล์นั้นมีการอ้างอิงถึงฟังก์ชันในไฟล์อื่นภายในแพ็กเกจเดียวกันจะเกิดข้อผิดพลาดเนื่องจากคุณไม่ได้บอกให้ Go รันแพ็กเกจทั้งหมดคุณบอกให้รันไฟล์นั้นเพียงไฟล์เดียว

คุณสามารถบอกให้ go รันเป็นแพ็กเกจทั้งหมดได้โดยจัดกลุ่มไฟล์เป็นแพ็กเกจในการรันที่คอมเมนต์ได้หลายวิธี นี่คือตัวอย่างบางส่วน (หากเทอร์มินัลของคุณอยู่ในไดเร็กทอรีของแพ็คเกจของคุณ):

go run ./

หรือ

go run test1.go test2.go

หรือ

go run *.go

คุณสามารถคาดหวังพฤติกรรมเดียวกันได้โดยใช้คำสั่ง build และหลังจากเรียกใช้ไฟล์ปฏิบัติการที่สร้างขึ้นจะรันเป็นแพ็กเกจที่จัดกลุ่มซึ่งไฟล์จะรู้เกี่ยวกับฟังก์ชันแต่ละตัวเป็นต้น

go build ./

หรือ

go build test1.go test2.go

หรือ

go build *.go

จากนั้นเพียงแค่เรียกใช้ไฟล์ปฏิบัติการจากบรรทัดคำสั่งจะให้ผลลัพธ์ที่คล้ายกับการใช้คำสั่ง run เมื่อคุณรันไฟล์ทั้งหมดพร้อมกันเป็นแพ็คเกจทั้งหมด เช่น:

./test1

หรือชื่อไฟล์ปฏิบัติการของคุณจะถูกเรียกเมื่อสร้างขึ้น


0
โครงสร้างโฟลเดอร์

ซ้ำกัน
  |
  | --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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.