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

使用时,类型看起来像:

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

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

如果与模式匹配,NewSlackUser将起作用。如果没有,它将抛出错误。

基于this的匹配模式为:
^@[a-z0-9][a-z0-9._-]*$
(我是Go的新手,因此对我的方法进行的任何更正都值得赞赏)

最佳答案

使用结构类型:

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

关于go - 如何创建从与模式匹配的字符串派生的Go类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42112907/

10-16 06:35