2016-06-22 16 views
2

Golangに正規表現を書いて文字列に英数字、ピリオド、およびアンダースコアしかないことを確認しようとしています。しかし、私は以前に見たことのないエラーにぶつかり、グーグルで失敗しました。ここで正規表現はGolangの "定数ではありません"

は正規表現です:ここでは

pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 

は誤りです:

const initializer regexp.MustCompile("^[A-Za-z0-9_\\.]+") is not a constant 

"定数がない" とはどういう意味し、私はこれをどのように修正するのですか?
ありがとうございます。

答えて

8

これは、通常、exのような型を持つパッケージレベルの変数に代入しようとするときに発生します十分、Regexp)。 int,stringなどの基本タイプだけが定数になります。詳細は、hereを参照してください。

例:

var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 

加えて、私は通常の変数として扱われていると言うことは注意を置く:あなたはそれを動作させるためにvarとしてそれを宣言する必要が

pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 
// which translates to: 
const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 

定数:

var /* const */ pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 
3

Go宣言コンテキストでは、単純な=の代入では変数ではなく定数が作成されます。 (宣言の外では、それがすでに存在している必要があり、変数への代入です)

しかし、一定の初期化は定数のみを含めることがある - ないregexp.MustCompile()などの呼び出し - のでpatternは、このケースで一定とすることができません後でその値を変更する計画はありません。

あなたはどちらかがそれを置くことによって、それを変数を作成する必要があることを意味し、(基本的なタイプがあることができ、実際には、あなたが何らかの形で何かを呼び出すことなく、それを初期化できたとしても、Regexpは、移動中に一定とすることができません。) var文の中や:=の代わり=と関数の中にそれを宣言する:

var (
    pattern = ... 
) 

または

var pattern = ... 

または

func something() { 
    pattern := ... 
} 
4

エラーはかなり明確です。あなたが世界的にこれを実行しようとしている場合...

はしないでください。

const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 

は代わりに実行します。

var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`) 

それとも、本当に定数のパターンたい場合:

const pattern = `^[A-Za-z0-9_\.]+` 
var alphaNum = regexp.MustCompile(pattern) 
関連する問題