22

私は Google Go で遊んでいて楽しい (!) のですが、パッケージ サブシステムに問題があります。

Mac OS X Lion でGo 1.0.1を実行しています。また、さまざまな単一ファイル プログラムを問題なくビルドしました (また、html/テンプレートを使用して小さな webapp を問題なくビルドし、エラーなしでコンパイルおよび実行します)。

「再利用可能な」パッケージ (even.go) を定義しました。

package even

func Even(i int) bool {
    return i % 2 == 0
}

func Odd(i int) bool {
    return i % 2 == 1
}

およびコンシューマー プログラム (useeven.go):

package main

import (
    "./even"
    "fmt"
)

func main() {
    a := 5
    b := 6

    fmt.Printf("%d is even %v?\n", a, even.Even(a))
    fmt.Printf("%d is odd %v?\n", b, even.Odd(b))
}

しかし、「ライブラリ」をコンパイルすると

go build even.go

何も得られませんでした... エラーもメッセージもありません... どうなりますか?

どうすればいいですか?

4

4 に答える 4

11

「これはどうすればいいですか?」という質問に対する答えです。Goコードの書き方で説明されています。 これは非常に重要なことであり、一見の価値があります。

の動作はgo build不可解に見えるかもしれませんが、実際にはコマンド ライン プログラムの慣例です。出力がなければ、プログラムが正常に実行されたことを意味します。それで、それは何をしましたか?そのためにあなたの答えはgo help build

... それ以外の場合、build はパッケージをコンパイルしますが、結果を破棄し、パッケージをビルドできるかどうかのチェックとしてのみ機能します。

もっと欲しかった?もちろん。「Go コードの書き方」では、これを行う良い方法を説明しています。プログラムを簡単に修正するために、go コマンドは各パッケージと各実行可能プログラムが別のディレクトリにあることを想定していることを説明します。useeven.go の直下に even という名前のディレクトリを作成し、even.go をそこに移動すれば、そのままgo run useeven.go実行できます。

于 2012-05-02T16:18:18.350 に答える
5

go build「単一のメインパッケージ」をビルドするときにのみ出力ファイルを生成します。他のパッケージのファイルを出力したい場合は、go install. これにより、そのパッケージがビルドされ、pkgsディレクトリにインストールされます。

于 2014-03-28T22:19:16.567 に答える
2

OPのコメントに記載されているように、独自のフォルダーに入れると正常に動作go buildします: . (インポート内の) には、どこにでもインストールする必要なく、「ローカル パッケージ」を自動的にビルドするGo マジックが少しあります。go run useeven.goeven.go./even/even.go./

useeven/
├── even
│   └── even.go
└── useeven.go

魔法なしでこれを機能させたい場合は./、ライブラリをインストールする必要があります。プロジェクトでこれを機能させる手っ取り早い方法 (ライブラリの名前空間を汚染するリスクがあります) は、次のようなシンボリック リンクを使用してライブラリのソースの場所を登録することです (この例GOPATHでは~/go):

[ useeven ]
$ ln -s $(pwd)/even ~/go/src

go get evenプログラムをビルドすると、ライブラリの最新バージョンをインストールするために自動的に実行されます。

go installこれはライブラリに対して*を機能させるわけではなく、それを行う必要がなくなるだけであることに注意してください。


急いでいない場合は、これを行うためのより慣用的な方法があります: How to import local packages in go?

于 2019-05-07T01:06:54.263 に答える