21
loading...
This website collects cookies to deliver better user experience
map
, filter
или fold
на Go наткнутся на непропорцинально возросшее количество визуального шума.var cats = []string{"thusМамона", "thusАсмодей", "thusВельзевул"}
// функциональный
// никакого вам чейнинга!
var stripped = Map(cats, func(name string) string {
return strings.TrimPrefix(name, "thus")
})
var lowered = Map(stripped, strings.ToLower)
var counts = Map(counts, func(name string) int {
return strings.Count(name, "а")
})
// императивный
var counts = make([]int, 0, len(cats))
for _, name := range cats {
var stripped = strings.TrimPrefix(name, "thus")
var lowered = strings.ToLower(stripped)
counts = append(counts, strings.Count(name, "а"))
}
User{ID, Name, Labels}
, и для разных нужд из слайса нужно выудить срез по каждому из полей. Вот и пишешь кучу функций вида usersIDs
, usersNames
и usersLables
там, где можно было бы обойтись двумя строками дженерик кода. Опять же, только с хэш-мапами мне приходит с десяток функций вида func[K, V comparable] Reverse(map[K]V) map[V]K
, которые вроде бы и просто писать самому, но так надоедает!Teapot
есть метод .Brew(water) error
, то выражение Teapot.Brew
будет иметь тип func(Teapot, water) error
. func main() {
var cats = []Cat{
{100},
{500},
{420},
}
fmt.Printf("%q\n", Map(cats, Cat.Mew))
// ["mew 100" "mew 500" "mew 420"]
}
type Cat struct{ index int }
func (cat Cat) Mew() string {
return fmt.Sprintf("mew %d", cat.index)
}
func Map[X, Y any](xx []X, fn func(X) Y) []Y {
var yy = make([]Y, 0, len(xx))
for _, x := range xx {
yy = append(yy, fn(x))
}
return yy
}