SVI a1a08d78c3 SVI Перемещение 10 months ago
..
.gitignore a1a08d78c3 SVI Перемещение 10 months ago
LICENSE a1a08d78c3 SVI Перемещение 10 months ago
README.md a1a08d78c3 SVI Перемещение 10 months ago
interface.go a1a08d78c3 SVI Перемещение 10 months ago

README.md

stringish

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 Reference Test Status

Install

go get github.com/clipperhouse/stringish

Examples

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
}

Motivation

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.

Used by

Prior discussion