Можно пойти еще дальше. Вместо создания служебных функций можно создать специфический тип и предоставить Sort как метод так:
package stringset
type Set map[string]struct{}
func New(...string) Set { ... }
func (s Set) Sort() []string { ... }
Это изменение делает клиент еще более простым. На пакет stringset будет только одна ссылка:
set := stringset.New("c", "a", "b")
fmt.Println(set.Sort())
Небольшой рефакторинг убирает бессмысленное имя пакета и дает выразительный API. Как упомянул Дейв Чейни (член команды проекта Go), мы достаточно часто находим служебные пакеты, которые управляют стандартными возможностями. Например, если мы решим иметь клиентский и серверный пакеты, куда нужно поместить общие типы? В этом случае одним из возможных решений будет объединение клиента, сервера и общего кода в единый пакет.
100 ошибок Go и как их избежать
·
Тейва Харшани