Delphi、C++からのGoLangの新機能:
Goで初めて独自のパッケージを作成しようとしたとき、ワークスペースのレイアウト方法などに関するすべての指示に従いましたが、コンパイラエラーが発生し続けました。
./myPackage.go:52: undefined: myFunc
少し調べてみると、Goのパブリックアクセス修飾子は、大文字の関数を宣言するだけで実現できることがわかりました。すばらしいです。
しかし、コンテナクラス-List
を試し始めたとき、次のようにList参照の戻り値を宣言する必要があることに気付きました。
func GetFactors(value *int64) *list.List {...
*list
は小文字です。
リストへのローカル参照を宣言したときも同じです-私は使用しなければなりませんでした:
l := list.New()
再び、list
の小文字
だから、私は混乱しています。ルールは何ですか?リストの呼び出しと参照は明らかに公開されている、または私はそれらを呼び出し/使用することはできません-なぜそれらが小文字なのですか?
この場合、list
はimport "container/list"
を介してインポートするパッケージの名前であり、そのパブリックメンバーはList
のように大文字です。
ルールは、パブリック関数、型などを大文字にする必要があるということです。
インポートしたパッケージを好きなようにエイリアスできますが、デフォルトでは、パッケージパスの最後の部分の名前(この場合はlist
)だけです。
更新:パッケージパスの最後の部分ではありません。これは実際のパッケージ名です(多くの場合同じです)。
注: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以降、すべてのリポジトリに適用されます。
注: パッケージ名の仕様を指定 パッケージ名が常に小文字であることは言及しません。
その名前は、「 letter 」のコレクションで構成される identifier で表されるとのみ述べています。
このスレッド は明確にします:
パッケージ名は何でも構いませんが、必要に応じて大文字で始めることができます。
しかし、慣習はすべて小文字であるため、大文字を入力する手間が省けると思います。大文字/小文字のエクスポート可能性は、プライベートパッケージを持つことができないため、パッケージには実際には関係ありません。
それがわかれば、簡単に認識できます:
list.New()
for aconstructor(常にパッケージレベルで、 os.NewFile()
などのタイプの初期化されたインスタンスを構築します。list.List
パッケージリストの struct type (同じパッケージの他のstruct typeは list.Element
)。