A small Go module that provides a generic type constraint for “string-like” data, and a utf8 package that works with both strings and byte slices without conversions.
type Interface interface {
~[]byte | ~string
}
go get github.com/clipperhouse/stringish
import (
"github.com/clipperhouse/stringish"
"github.com/clipperhouse/stringish/utf8"
)
s := "Hello, 世界"
r, size := utf8.DecodeRune(s) // not DecodeRuneInString 🎉
b := []byte("Hello, 世界")
r, size = utf8.DecodeRune(b) // same API!
func MyFoo[T stringish.Interface](s T) T {
// pass a string or a []byte
// iterate, slice, transform, whatever
}
Sometimes we want APIs to accept string
or []byte
without having to convert
between those types. That conversion usually allocates!
By implementing with stringish.Interface
, we can have a single API, and
single implementation for both types: one Foo
instead of Foo
and
FooString
.
We have converted the
unicode/utf8
package
as an example -- note the absence of*InString
funcs. We might look at x/text
next.
-
clipperhouse/uax29: stringish trie, stringish iterator, stringish SplitFunc