2017-01-08 14 views
0

私は現在Goで作業を開始しており、パッケージの命名とワークスペースのフォルダ構造についてはまだ掘り下げていません。単一のgoプロジェクトで使用されるgoパッケージの適切なフォルダ構造

しかし、私はGoのパラダイムに従って自分のコードを正しく構成する方法はあまりよく分かりません。それは$GOPATH/srcに常駐するようここ

は私の現在の構成例である:

github.com/myusername/project 
|-- main.go 
+-- internal 
+---- config 
|------ config.go 

だから私は、今度は、それが唯一でなければならないことのように特化され、configパッケージを使用していますprojectというプロジェクトを持っていますprojectによって使用されます。したがって、私はgithub.com/myusername/configの下にそれを望んでいない、右か?今

質問は、それが(例えば、それprojectconfigに名前を付ける)内部パッケージ構造を使用するか、私が代わりにgithub.com/myusername/$pkgnameの下に私のプロジェクトの特定のパッケージを入れて、それがprojectに属することを何とか示すべき「良い」とは?

+0

'config.go'には何が定義されていますか?それは本当に独自のパッケージを保証しますか?あなたの 'github.com/myusername/project'パッケージに設定されていない設定タイプ/関数/変数を持っているだけではありませんか? –

+0

パッケージで提供されるすべての機能では可能ではありませんか?しかし、はい、この例では、私はちょうど2つの関数と設定タイプを 'project'パッケージに入れることができます。私は実際に、内部パッケージをいつ使うべきか、そうしなければならないかという一般的な考え方にもっと興味があります。さらに、小さなパッケージを作成する際に何か不具合はありますか? – sge

+1

ほとんどのGoプロジェクトは 'internal'パッケージを持っています。あなたのルートに 'config'を置いて、あなたのプロジェクトをうまく文書化していると分からないなら、ユーザはそれを使用してはならない、または使用してはならないことを知っています。私は個人的にはどこに置くべきか考えないほうがいいと思うが、すべてを1か所に書いて、理にかなったときにパッケージ/モジュールに抽出するだけだ。 – kopiczko

答えて

0

プロジェクトで1つのプログラムが作成された場合、最も一般的な構造は、前述のものです。プロジェクトは、一般的な方法は、このような構造を使用している複数のプログラムを生成する場合

は:

<project>/ 
    cmd/ 
    prog1/ 
     main.go 
    prog2/ 
     main.go 

は、あなたのプロジェクトは、最も一般的な構造は、プロジェクトのルートを使用しているサードパーティの消費のためのライブラリとしてコードを行く公開している場合ドメインモデルとAPIを公開する。

<project>/ 
    model.go 
    api.go 

「github.com/user/project」をインポートし、モデルとAPIを使用できるようにするサードパーティ製のコードです。

2番目と3番目のオプションを組み合わせて表示するのが一般的です。

また、依存関係の使用をカプセル化するパッケージを持つことも良い方法です。例えば。あなたのプロジェクトが

<project>/ 
    cmd/ 
    prog1/ 
     main.go 
    elastic/ 
    impl.go 
    dao.go 
    model.go 

弾性検索クライアントを使用していますので、dao.goにあなたはDAOのAPIを定義し、弾性/ impl.goます(インポート弾性ライブラリ、ドメインモーダルと)に面でDAOの実装を定義すると弾性の。最後に、実際のプログラムを生成するmain.goからすべてをインポートします。

thisこの問題についての素晴らしいプレゼンテーションを参照してください。

関連する問題