2016-04-16 4 views
3

初心者であれば、これは新しいソースファイルを開始するたびにいつも私を得ます。だから、パッケージ名は識別子でなければならないので、パッケージ名にはの二重引用符を付けないで、というパッケージ名を定義します。スペースなどの無効な文字を含むことはできません。しかし、import宣言の場合、パッケージ名は二重引用符で囲む必要があります。パッケージ名はpackage節で使用されている名前とまったく同じです。識別子でもなければなりません。他のメリットがない限り、キーストロークを追加するだけです。私は、インポートが二重引用符で囲まれた文字列でなければならない理由は、このように設計されているのでしょうか。なぜ二重引用符を必要とするインポートの宣言

#include <foo.h>using System.Barimport java.lang.moo他の言語を参照すると、インポートする文字列はありません。

+5

[Goのインポートステートメントで引用符を使用する理由は何ですか?](http://programmers.stackexchange.com/questions/307417/what-was-the-reason-behind-using-quotes-in-gos- –

+0

ああ、それは言語の他の実装の可能性のために予約されていたのですか? – fluter

+0

それはそのスレッドのコンセンサスのようです。 –

答えて

3

パスa/b/fooは、識別子よりも文字列に似ています。識別子にはセパレータはなく、パスには識別子で許可されていない文字を含めることができます。パッケージ名にはピリオド(.)を含めることはできませんが、パッケージ名には空白を含めることはできませんが、パスはできますが、パスはできます。たとえば:

import "golang.org/x/exp/shiny/vendor/github.com/BurntSushi/xgb/render"` 

これは主に#includeパスを指定する文字列を使用していないとして、問題にリストされているC、と同じですが、外出先でのimport文との類似点を共有しています。文字列を区切るには引用符ではなく<>を使用しますが、2つの書式は両方とも文字列のようになります(#include <a/b/foo.h>#include "a/b/foo.h")。

+0

インポートパスは、パス内の部分がpackage句で定義された識別子とまったく同じであるため、任意のファイルシステムパスにすることはできません。パスの識別子で許可されていない唯一の文字は、セパレータ '/'です。 – fluter

+0

@fluterあなたが何を言っているのか分かりません。 「パス内のパーツは、まさにpackage節で定義されている識別子ですか?」という意味はどうですか? 'golang.org/x/exp/shiny/vendor/github.com/BurntSushi/xgb/render'の部分は' golang.org'、 'x'、' exp'、... 'render'です。後者の部分( 'render')はパッケージ名です。例えば' golang.org'と 'github.com'はパスの一部ですが、goの中の有効な識別子です。 –

+0

あなたが正しいです、インポートパスは言語仕様で 'ImportPath = string_lit .'と定義されています。ありがとう。 – fluter

関連する問題