golangのstrings.TrimLeftはイケてない

ツイートしたりもしたけど、やはり気になるのでつらつらとポエムる。

strings.TrimLeftわかりづらくね?

golangのstrings.TrimLeft(Right)とstrings.TrimPrefix(Suffix)の関係が嫌い。

TrimLeftの方は概念的にはTrimLeft(s string, cutset set<rune>)のはずなのに、TrimLeft(s string, cutset string)となってる。 結果、型としてはTrimLeft(string, string)TrimPrefix(string, string)は見分けがつかない。 Prefixの存在を知らないとTrimLeft("abc-back", "abc-")とか書かれてたときに想像する結果が二通りに分岐してしまう。 正解は"k"なわけだけど、"back"かな、と思っちゃう場合もある。というかgolangを2年触ってる僕だってそう思う。

すべての関数は型で中身が想像できるべきだ!なんて1ミリも思わないけど、こればっかりはわかりづらすぎないか?

じゃあどうするか

golangにはset<T>がない(と言うかジェネリクスないし)わけだけど、代わりに何使うか。 形式的にはmap[T]struct{}とか定番だけど、

strings.TrimLeft("abcback", map[rune]struct{}{
    'a':struct{}{},
    'b':struct{}{},
    'c':struct{}{}
})

悍ましくて書きたくない。

結局、arrayじゃね?ということで、strings.TrimLeft(string, []rune)としてほしい。 結局stringと似た何かなんだけど、配列はシーケンシャルであると同時に集合としてのニュアンスを(stringよりは)持つと思うんだよね。

2に期待

golang 2でstrings.TrimLeft(string, []rune)への変更が為されないかと密かに期待している。 RFC書きたいけど、議論が紛糾しそうで、そんな場に英語で参戦する勇気が出ない。