用Go中的类型声明替换包装结构

时间:2012-11-04 13:53:30

标签: initialization go type-conversion

我想从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,但它没有编译。返回包装基础类型的自定义类型的一般模式是什么?

2 个答案:

答案 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")
}

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