2017-02-08 4 views
0

Я пытаюсь создать новый тип Go, основанный на string, но должен соответствовать шаблону (Slack username, например @ben).Как создать тип Go, полученный из строки, соответствующей шаблону?

При использовании типа будет выглядеть примерно так:

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

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

Если соответствует шаблону, NewSlackUser будет работать. Если это не так, это вызовет ошибку.

Шаблон для соответствия, который основан на this, является:

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

(я новичок в Go, так что любая поправка к моему подходу очень ценится)

+1

См https://golang.org/pkg/regexp/ – Volker

ответ

4

Использование тип структуры:

type SlackUser struct { 
    username string 
} 

Скомпилирует регулярное выражение:

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

Constructor:

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