我想从Go标准库扩展regexp
以便能够定义我自己的方法。我使用以下结构:
type RichRegexp struct {
*regexp.Regexp
}
如您所见,此结构只包含已包装的regexp.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 // How to do this?
}
我尝试将regexp.Regexp
转换为我的RichRegexp
,但它没有编译。返回包装基础类型的自定义类型的一般模式是什么?
答案 0 :(得分:5)
您可以使用转换,但在这种情况下,您的类型定义不是指针是必要的:
type MyRegexp *regexp.Regexp // Doesn't work
这由the spec支持:
接收器类型必须是T或* T形式,其中T是类型名称。 由T表示的类型称为接收器基类型; 一定不是 指针或接口类型,必须在同一个声明 包作为方法。据说该方法与基类型绑定 并且方法名称仅在该类型的选择器中可见。
但是,你可以这样做:
type MyRegexp regexp.Regexp
当您正在处理值时,您可以执行以下操作:
x := regexp.MustCompile(".*")
y := MyRegexp(*x)
你有自己的正则表达式。
正在播放的完整代码:http://play.golang.org/p/OWNdA2FinN
作为一般模式,我会说:
struct
。答案 1 :(得分: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")
}