0

Go パッケージに関する次の主張は正確ですか?

  1. import "package_name"$GOPATH、ユーザーの go ディレクトリを保持する変数、または標準の go インストール ディレクトリ ツリーにあると仮定して、package_name という名前のディレクトリからすべてのファイルをインポートします。

  2. package_name ディレクトリ内のファイルは、通常、package package_name. しかし、それらは必須ではありません。実際、は、インポートされた package_name ディレクトリにファイルが見つかった場合、import "package_name"その行を含むファイルもインポートします。package foo

  3. 大文字で始まるすべての関数は、パッケージの package_name 宣言で指定された名前を介してアクセスされます。たとえば、次のようになります。

package_name.Function_in_file_that_declares_package_nameまたother_than_package_name.Function_in_file_that_declares_other_than_package_name

  1. ユーザー定義パッケージはgo install、パッケージ ディレクトリ内からコマンド ラインで実行されます。ただし、go は組み込みパッケージ ディレクトリと同じ名前のディレクトリのインストールを拒否します。たとえば、go には既に組み込みパッケージ「strings」用の string ディレクトリがあるため、strings ディレクトリをインストールすることはできません。ただし、ユーザーは、組み込みの string フォルダーを変更せずに、my_strings ディレクトリを作成し、その中に記述されているファイルを配置することで、strings パッケージに関数を追加できますpackage strings。ここで、 でimport my_stringsアクセスされる追加のユーザー定義文字列関数をロードしますstrings.Function_name

要約すると、importキーワードは、特定のディレクトリからファイルをロードするために使用されます。また、キーワードpackageは、そのファイルの外部から大文字の関数にアクセスするための名前空間を作成します。

上記のすべてを正しく理解していますか?

4

2 に答える 2

4

耳障りに聞こえるかもしれませんが、ほとんどすべての仮定は完全に間違っています。

http://golang.org/doc/effective_go.html#package-nameshttp://golang.org/ref/spec#Packagesを見てimport、C に相当する Go とは考えないでくださいinclude

Go のパッケージはコンパイル済みのライブラリに似ており、import "some/path/foo"は foo.a でのリンクに似ています (ただし、エクスポートされたエンティティを -normaly- の下で利用できるようにもします) foo.SomethingExported

http://golang.org/doc/code.htmlを見ると、パッケージとは何か、どのように使用されるかが明確になるはずです。

于 2013-08-20T09:05:41.440 に答える
4
  1. 「import」の引数は、パッケージ名ではなく import_path です。で見つかったパッケージからエクスポートされたエンティティを$GOPATH/src/import_path、"import" 句が表示されるファイル スコープで使用できるようにします。

  2. *_test.go単一のディレクトリ内のファイルとを含むファイルを除くすべての *.go ファイル// +build ignoreは、句で同じ名前を指定する必要があります。そうしないとpackage name、go ビルド システムによって拒否されます。

  3. 大文字ではありませんが、Unicode カテゴリの Lu に属します。関数ではなく、任意の TLD エンティティ。

  4. いいえ、インポート パスを使用して、任意のディレクトリから任意のパッケージをインストールできます。はい、stdlib のパッケージには優先順位があり、「オーバーライド」することはできません。ただし、たとえばを使用して stdlib パッケージを効果的に「置き換える」ことができます。import strings "github.com/foo/mystrings". ただし、効果はローカル/ファイルのみです。

要約すると、いいえ、インポートは、ファイル スコープで利用可能な他のパッケージからのエンティティを作成するために使用されます。キーワード「package」は名前空間を作成しません。「インポート」の効果はファイル スコープです。前の文を参照してください。通常、インポートされたエンティティは修飾名で参照されます。その修飾子は一種の名前空間ですが、「エクスポーター」( package foo) がそれを制御するわけではないことに注意してください。代わりに、コントロールは「インポーター」側にあります: import whatever_local_name "whatever_import_path". ただし、デフォルトの修飾子はインポート パスのベース名です。

「私たちは皆同意しますか?」

全くない。

于 2013-08-20T08:30:09.597 に答える