155

Goの別のファイルから関数を呼び出したい。誰か助けてもらえますか?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

から電話demoをかける方法は?test2test1

4

8 に答える 8

108

mainパッケージに複数を含めることはできません。

より一般的には、パッケージ内に特定の名前を持つ複数の関数を含めることはできません。

を削除してmaintest2.goアプリケーションをコンパイルします。demo関数はから表示されますtest1.go

于 2013-01-04T10:17:32.317 に答える
91

Go Langはデフォルトで、言及されたファイルのみをビルド/実行します。すべてのファイルをリンクするには、実行中にすべてのファイルの名前を指定する必要があります。

以下の2つのコマンドのいずれかを実行します。

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

それらを構築したい場合は、同様のことを行う必要があります。

于 2017-05-13T13:16:14.053 に答える
53

私は同じものを探していました。「 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")
}
于 2017-11-16T15:20:08.467 に答える
8

機能的、客観的、簡単な簡単な例:

main.go

package main

import "pathToProject/controllers"

func main() {
    controllers.Test()
}

control.go

package controllers

func Test() {
// Do Something
}

忘れないでください。表示される外部関数、変数、およびメソッドは大文字で始まります。

すなわち:

func test() {
    // I am not Visible outside the file
}
 
func Test() {
    // I am VISIBLE OUTSIDE the FILE
}
于 2020-11-23T15:17:09.100 に答える
5

実行go run test1.goしたばかりで、そのファイルに同じパッケージ内の別のファイル内の関数への参照がある場合、パッケージ全体を実行するようにGoに指示しなかったため、エラーが発生します。その1つのファイルのみを実行するように指示しました。

いくつかの方法でコンマされた実行でファイルをパッケージとしてグループ化することにより、パッケージ全体として実行するように指示できます。次にいくつかの例を示します(端末がパッケージのディレクトリにある場合)。

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

または、実行可能ファイル名が作成されたときに呼び出されたものは何でも。

于 2020-07-14T05:42:01.013 に答える
5
フォルダ構造

複製
  |
  | --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
于 2020-10-02T03:00:43.690 に答える
4

他のファイルをモジュールとして宣言することにより、別のファイルから関数をインポートできます。両方のファイルを同じプロジェクトフォルダーに保存します。最初のファイルtest1.goは次のようになります。

package main

func main() {
    demo()
}

パッケージに存在できるメイン関数は1つだけなので、2番目のファイルからメイン関数を削除します。2番目のファイルは次のtest2.goようになります。

package main

import "fmt"

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

ここで、プロジェクトディレクトリが作業ディレクトリとして設定されている任意の端末から、次のコマンドを実行します go mod init myprojectgo.modこれにより、プロジェクトディレクトリに呼び出されるファイルが作成されます。このmodファイルの内容は次のようになります。

module myproject

go 1.16

ターミナルからコマンドを実行するだけgo run .です!デモ機能は必要に応じて最初のファイルから実行されます!!

于 2021-08-06T23:58:33.233 に答える
0

goモジュールで何が起こっているのかわからなかった愚かな人は言うべきです:

  1. main.goを作成します
  2. 同じディレクトリにこれをあなたのターミナルに書いてください

mod init"your modulename"に移動します

  1. 新しいディレクトリを作成し、その中に入る
  2. 新しい.goファイルを作成し、ディレクトリ名をパッケージ名として書き込みます
  3. 必要な関数を記述します; 関数は大文字で始まらなければならないことに注意してください
  4. main.goに戻って

「モジュール名/新しいディレクトリの名前」をインポートします

  1. 最後に必要なのは、パッケージの名前とその後の関数名を書くことです。

「あなたの新しいディレクトリの名前」+。+ YourFunction()

  1. ターミナルにこれを書いてください

実行します。

代わりにgorunmain.goと書くことができます。ディレクトリを作成したくない場合と、同じディレクトリに新しい.goファイルを作成したい場合があります。この状況では、関数を大文字で開始するかどうかは関係ありません。すべての.goファイルを実行する

実行する*.go

なぜなら

main.goを実行します

動作しません。

于 2021-12-08T19:18:37.250 に答える