別のファイルで宣言されているgolangの「未定義」関数?


135

別のファイルの関数を呼び出す基本的なgoプログラムを作成しようとしていますが、同じパッケージの一部です。ただし、次を返します。

undefined: NewEmployee

ここにソースコードがあります:

main.go

package main

func main() {
emp := NewEmployee()    
}

employee.go

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}

あなたのファイルにはパッケージステートメントがありますか?入力したものにはがなくpackage x、メインパッケージには通常1つのファイルのみが含まれ、必要な他の部分がインポートされます
Chris Pfohl

8
使ってるのgo run?(およびgolang.org/doc/code.htmlを参照)
JimB

1
@JuanMは、私の質問があったことである完全なソースmain.goemployee.go?すべてのgoファイルにはpackageステートメントがあるはずであり、私には何も表示されないからです。参照:golang.org/doc/code.html#PackageNames
Chris Pfohl

1
employee.goの最後の関数は間違っています(関数名がない、戻り値の型が宣言されていない)。それはあなたが求める問題ではありませんが、もっと問題があることを示しています。コンパイル時に完全なコードと完全なエラーを投稿できますか?
siritinga 2015年

1
次に、あなたの行動を見せてください!GOPATH、実際のコード、およびgoツールの呼び出し方法。
JimB

回答:


172

「Goコードの書き方」をお読みください。

で使用しない/srcでくださいGOPATH。パッケージはにあり$GOPATH/srcます。

以下のためにbuildまたはinstallあなたは、パッケージディレクトリ内のファイルを持っている必要があります。

の場合go run、引数としてすべてのファイルを指定する必要があります。

go run main.go employee.go

しかし、ほとんど常にgo install、またはgo build(そしてできれば前者を使用するべきですgo build


入力@JimBをありがとう!環境変数を編集し(GOBINの設定も忘れていました)、ファイルを正しい場所に移動しましたが、intstallに移動しようとすると、同じエラーが発生します。助言がありますか?
Juan M

他にエラーがないことを確信していますか?employee.goファイルをそのままコンパイルすることはできません。そうでなければ、私はあなたが何をしているかを正確に見る必要があります。正確なパス、呼び出しなど
JimB

8
または$ go run * .go
Puran

走ること $ go run *.go代わりにすべてのファイルを実行しているの近道だろう
offerni

60

私はちょうどGoLand(これはGoのIntellij IDEA)で同じ問題を抱えており、解決策を考え出しました。Run kindFileからPackageまたはに変更する必要がありDirectoryます。これは、[ Run/Edit構成]に移動した場合、ドロップダウンから選択できます。

例:パッケージのため~/go/src/a_package、使用Package pathのをa_packageDirectory~/go/src/a_packageRun kindPackageDirectory


1
ありがとう、これが私が探していたものです。あなたの答えはIntellij IDEAについてであることを述べてください。
kivagant

12

を使用している場合はgo run、実行してくださいgo run *.go。現在の作業ディレクトリにあるすべてのgoファイルを自動的に検索し、コンパイルしてからmain関数を実行します。


この方法でそれを行うことに落とし穴はありますか?これはOPの質問に対する最も単純な答えのようです。
Stavros_S 2018


8

以下のいずれかをお試しください。

方法01:プロジェクト名がMyProject

  • パスに移動し、go build入力してEnter キーを押します。
  • 実行可能ファイルをプロジェクト名として作成します( "MyProject")
  • 次に、端末タイプ./MyProjectでEnterキーを押します

と入力すると、両方の手順を一度に実行できますgo build && ./MyProject。すべてのgoファイルでプロジェクトを適切に実行します。

方法02

go run *.go入力してEnterキーを押すだけです。これによりすべてのが実行されますgo files

これが誰かに役立つことを願っています。


4

別のgoファイルから関数を呼び出し、Golandを使用している場合は、[実行]メニューから[設定の編集]オプションを見つけ、実行の種類をファイルからディレクトリに変更します。すべてのエラーをクリアし、他のgoファイルから関数を呼び出すことができます。


1

私は同じ問題に遭遇しました Go11場合に備えて、他の人を助けるために私がそれをどのように解決したかを共有したかっただけです。

私はGoプロジェクトを外部 $GOPATHに持っていたため、GO111MODULE=onこのオプションをオンにせずにオンにする必要がありました。これにより、この問題が発生します。あなたが全体を構築またはテストしようとした場合、packageまたはdirectoryそれなしでは解決されない場合でもGO111MODULE=on


1

goコードの記述方法に従っていない場合は、今すぐgoモジュールを使用する必要があります

goモジュールでは、コードを$ GOPATH / srcに配置する必要はありません。他のどの場所にも住むことができます。

/ employeeなどの別のディレクトリにコードを移動して、それを機能させるには、従業員ディレクトリのすぐ下に移動モジュールを初期化します。

go mod init example.com/employee

0

ソースフォルダーが/ go / src / blogの構造になっている場合(ソースフォルダーの名前がblogであると想定)。

  1. cd / go / src / blog ...(パッケージがあるフォルダー内でcd)
  2. インストールに行く
  3. ブログ

ファイルを手動で一覧表示したり、コマンドラインでメソッドを「バッシング」したりする代わりに、すべてのファイルを同時に実行する必要があります。


0

go run .すべてのファイルを実行します。エントリポイントはmain()mainパッケージにです。

別のオプションは、バイナリをビルドしgo buildて実行することです。


0

コマンドgo run *.goを使用して、パッケージ内のすべてのgoファイルを実行するだけです!


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