如何创建从与模式匹配的字符串派生的Go类型?

时间:2017-02-08 12:16:39

标签: go types

我正在尝试创建一个基于string的新Go类型,但需要匹配模式(Slack用户名,例如@ben)。

使用时,类型如下:

var user SlackUser
user = SlackUser("@ben")

fmt.Println(user) //This should print: @ben

如果匹配模式,NewSlackUser将起作用。如果没有,则会引发错误。

要匹配的模式(基于this)是:

^@[a-z0-9][a-z0-9._-]*$

(我对Go来说很新,所以对我的方法进行任何修改都非常感激)

1 个答案:

答案 0 :(得分:4)

使用结构类型:

type SlackUser struct {
    username string
}

编译正则表达式:

var (
    pattern = regexp.MustCompile("^@[a-z0-9][a-z0-9._-]*$")
)

构造

func NewSlackUser(username string) (*SlackUser, error) {
    if !pattern.MatchString(username) {
        return nil, errors.New("Invalid username.")
    }
    return &SlackUser{ username }, nil
}

纵梁:

func (s *SlackUser) String() string {
    return s.username
}

完整example