web-dev-qa-db-ja.com

パブリック、プライベート-大文字、小文字:

Delphi、C++からのGoLangの新機能:

Goで初めて独自のパッケージを作成しようとしたとき、ワークスペースのレイアウト方法などに関するすべての指示に従いましたが、コンパイラエラーが発生し続けました。

./myPackage.go:52: undefined: myFunc

少し調べてみると、Goのパブリックアクセス修飾子は、大文字の関数を宣言するだけで実現できることがわかりました。すばらしいです。

しかし、コンテナクラス-Listを試し始めたとき、次のようにList参照の戻り値を宣言する必要があることに気付きました。

func GetFactors(value *int64) *list.List {...

*listは小文字です。

リストへのローカル参照を宣言したときも同じです-私は使用しなければなりませんでした:

l := list.New()

再び、listの小文字

だから、私は混乱しています。ルールは何ですか?リストの呼び出しと参照は明らかに公開されている、または私はそれらを呼び出し/使用することはできません-なぜそれらが小文字なのですか?

41
Vector

この場合、listimport "container/list"を介してインポートするパッケージの名前であり、そのパブリックメンバーはListのように大文字です。

ルールは、パブリック関数、型などを大文字にする必要があるということです。

インポートしたパッケージを好きなようにエイリアスできますが、デフォルトでは、パッケージパスの最後の部分の名前(この場合はlist)だけです。

更新:パッケージパスの最後の部分ではありません。これは実際のパッケージ名です(多くの場合同じです)。

44
Eve Freeman

注:Go 1.5(2015年第2四半期)以降、「保護された」インポート(「内部」という名前)も取得されます!

Go 1.4ドキュメント を参照してください:

Goのパッケージシステムを使用すると、プログラムを明確な境界を持つコンポーネントに簡単に構成できますが、アクセスの形式はローカル(非エクスポート)とグローバル(エクスポート)の2つのみです。
たとえば、公開リポジトリの一部であるが、それが属するプログラムの外部で使用することを意図していないコードへのインターフェースのクライアントの取得を回避するために、エクスポートされないコンポーネントが必要な場合があります。

Go言語にはこの区別を強制する力はありませんが、Go 1.4では、goコマンドは、それらが存在するソースサブツリーの外部のパッケージによってインポートされない「内部」パッケージを定義するメカニズムを導入します。

このようなパッケージを作成するには、internalという名前のディレクトリまたはinternalという名前のディレクトリのサブディレクトリにパッケージを配置します。 。
goコマンドがパスにinternalを含むパッケージのインポートを検出すると、インポートを実行するパッケージが内部の親をルートとするツリー内にあることを確認しますディレクトリ。
たとえば、パッケージ.../a/b/c/internal/d/e/fは、.../a/b/cをルートとするディレクトリツリー内のコードによってのみインポートできます。
.../a/b/gまたは他のリポジトリのコードではインポートできません。

Go 1.4では、メインのGoリポジトリに内部パッケージメカニズムが適用されます;
1.5以降、すべてのリポジトリに適用されます

14
VonC

注: パッケージ名の仕様を指定 パッケージ名が常に小文字であることは言及しません。
その名前は、「 letter 」のコレクションで構成される identifier で表されるとのみ述べています。

このスレッド は明確にします:

パッケージ名は何でも構いませんが、必要に応じて大文字で始めることができます。
しかし、慣習はすべて小文字であるため、大文字を入力する手間が省けると思います。

大文字/小文字のエクスポート可能性は、プライベートパッケージを持つことができないため、パッケージには実際には関係ありません。

それがわかれば、簡単に認識できます:

6
VonC