go言語で別のファイルから関数を呼び出す方法は?


107

go langの別のファイルから関数を呼び出したいのですが、誰か助けてくれますか?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

呼び出す方法demotest2からtest1


どういう意味go fmtですか?端末のように何ですか?それは彼が何かを気にかけていることをどのように示していますか?
チャーリーパーカー

回答:


77

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

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

取り外しmain中にtest2.go、アプリケーションをコンパイルします。demo関数から見えるようになりますtest1.go


1
maintest2.goで削除した後、ビルドして実行できますが、test1.goをgo run test1.goまだ使用できません。どうして ?
Jeff Li

87
go run test1.go test2.go
リッチチャーチャー2013年

2
@RichChurcher、あなたが答えを出した。感謝します。また、大文字のDemo()を使用する必要があります。パブリック関数は慣例により大文字に変換されます
Raymond Chenon

test2に構造体がある場合、それもインポートされますか?
Angger

@RaymondChenon大文字は、別のパッケージで関数を使用する必要がある場合にのみ必要です。この場合、両方のファイルが同じパッケージ「メイン」にあるため、「非エクスポート」(プライベート読み取り)関数にもアクセスできます。tour.golang.org/basics/3を
シノジア

49

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

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

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

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


1
ポイントにまっすぐ。ありがとうございました!
Russo

37

同じものを探していました。「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")
}

5
メソッド名が大文字であることを確認してください。大文字にしないと機能しません。
最大

1
あなたの解決策をありがとう、それは私を大いに助けました!:)
jenkizenki

すみませんが、これは明らかに機能していません:package lib; expected main
Madeo

0

実行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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.