2012-11-04 6 views
5

私は独自のメソッドを定義できるようにGo標準ライブラリからregexpを拡張したいと考えています。私は、次の構造体を使用します。あなたが見ることができるようにラップ構造体をGoの型宣言に置き換えます

type RichRegexp struct { 
    *regexp.Regexp 
} 

を、この構造体は、ラップregexp.Regexpしか含まれていません。だから、私はこのような単純な型宣言でこれを置き換えることができるかどうかを疑問に思う:

type RichRegexp regexp.Regexp 

しかし、どのように、私は次のFUNCを書くべきですか?

func Compile(expression string) (*RichRegexp, error) { 
    regex, err := regexp.Compile(expression) 
    if err != nil { 
     return nil, err 
    } 
    return &RichRegexp{regex}, nil // How to do this? 
} 

私は私のRichRegexpregexp.Regexpを変換しようとしたが、それはコンパイルされませんでした。基礎となる型をラップするカスタム型を返す一般的なパターンは何ですか?また、ここで

答えて

3
package main 

import (
     "regexp" 
) 

type RichRegexp regexp.Regexp 

func Compile(expression string) (*RichRegexp, error) { 
     regex, err := regexp.Compile(expression) 
     if err != nil { 
       return nil, err 
     } 

     return (*RichRegexp)(regex), nil 
} 

func main() { 
    Compile("foo") 
} 

http://play.golang.org/p/cgpi8z2CfF

5

あなたが変換を使用することができますが、この場合には、それはあなたのタイプの定義がポインタではないこと、必要である:これはthe specによって支えられて

type MyRegexp *regexp.Regexp // Doesn't work 

受信者の種類は、Tまたは* Tの形式である必要があります.Tは型名です。 Tで示されるタイプは、受信機ベースタイプと呼ばれます。 ポインタまたはインターフェイスタイプであってはならず、メソッドと同じ パッケージで宣言する必要があります。このメソッドは基本タイプ にバインドされていると言われており、メソッド名はそのタイプのセレクタ内でのみ表示されます。あなたは今の値を処理していたよう

type MyRegexp regexp.Regexp 

は、次の操作を実行できます:

x := regexp.MustCompile(".*") 
y := MyRegexp(*x) 

をそして、あなたはあなた自身の正規表現型を持つ

ただし、これを行うことができます。

プレイで全コード:一般的なパターンとしてhttp://play.golang.org/p/OWNdA2FinN

、私は言うだろう:

  • それは変わりそうだとあなたが任意の値を格納する必要がない場合は、 タイプを使用します変換。
  • 埋め込みタイプに値を格納する必要がある場合は、structを使用してください。
  • あなたのコードが変更される可能性があり、物事の大規模な品種をサポートする必要がある場合、 インタフェースを定義し、埋め込む/型変換を使用しないでください。私はポインタを返す必要があるため
+0

'MyRegexpは(* x)'は、私の場合には動作しません。私は 'をしようとすると、Y:=&MyRegexp(* x)'は、私はエラーを取得する 'MyRegexpのアドレスを取ることができない(* x)'はhttp://play.golang.org/p/HbVoAVM1RY。 – deamon

+1

ポインタが必要な場合は、 '(* MyRegexp)(x)'のように 'MyRegexp'のポインタに変換するだけです。ポインタを扱っているので、 'x'の逆参照がもう必要ないことに注意してください。詳細については、[the spec](http://golang.org/ref/spec#Conversions)を参照してください。 – nemo

+0

あなたの説明をありがとう。 '(* MyRegexp)(x)'は 'jnml'も提案したものです。 – deamon

関連する問題