簡體   English   中英

如何用go語言從另一個文件調用函數?

[英]How to call function from another file in go language?

我想從 go lang 中的另一個文件調用函數,有人可以幫忙嗎?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

如何從test1調用test2 demo

您的包裹中最多只能有一個main

更一般地說,一個包中不能有多個具有給定名稱的函數。

拆下maintest2.go和編譯應用程序。 demo功能將從test1.go可見。

默認情況下,Go Lang 僅構建/運行提到的文件。 要鏈接所有文件,您需要在運行時指定所有文件的名稱。

運行以下兩個命令之一:

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

如果你想構建它們,你應該做類似的事情。

我正在尋找同樣的東西。 要回答您的問題“如何從 test1 調用 test2 中的演示? ”,這是我的方法。 使用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")
}

如果您只運行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

或者無論您的可執行文件名在創建時碰巧被調用。

Folder Structure

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

復制_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

一個功能性的、客觀的、簡單的快速示例:

main.go

package main

import "pathToProject/controllers"

func main() {
    controllers.Test()
}

control.go

package controllers

func Test() {
// Do Something
}

永遠不要忘記:可見的外部函數、變量和方法以大寫字母開頭。

IE:

func test() {
    // I am not Visible outside the file
}
 
func Test() {
    // I am VISIBLE OUTSIDE the FILE
}

您可以通過將另一個文件聲明為模塊來從另一個文件導入函數。 將這兩個文件保存在同一個項目文件夾中。 第一個文件test1.go應如下所示:

package main

func main() {
    demo()
}

從第二個文件中刪除 main 函數,因為一個包中只能存在一個 main 函數。 第二個文件test2.go應如下所示:

package main

import "fmt"

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

現在從任何將項目目錄設置為工作目錄的終端運行命令: go mod init myproject 這將在項目目錄中創建一個名為go.mod的文件。 mod文件的內容可能如下所示:

module myproject

go 1.16

現在從終端只需運行命令go run . 演示功能將根據需要從第一個文件執行!!

作為一個沒有發現 go 模塊發生了什么的愚蠢的人應該說:

  1. 創建你的 main.go
  2. 在同一目錄中,將其寫入您的終端中

go mod init“你的模塊名稱”

  1. 創建一個新目錄並進入其中
  2. 創建一個新的 .go 文件並將目錄名寫入包名
  3. 編寫任何你想要的函數; 請注意您的函數必須以大寫字母開頭
  4. 回到 main.go 和

導入“您的模塊名稱/新目錄的名稱”

  1. 最后你需要的是在它后面寫包名和你的函數名

“您的新目錄的名稱” + . + 你的功能()

  1. 並在終端中寫下這個

去跑步 。

你可以寫go run main.go來代替。 有時您不想創建目錄而想在同一目錄中創建新的 .go 文件,在這種情況下您需要注意,無論是否以大寫字母開頭都沒有關系,您應該運行所有 .go 文件

去跑 *.go

因為

去運行 main.go

不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM