我正在尝试创建一个基于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/