Skip to content

clipperhouse/stringish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

Handle strings and bytes interchangeably in Go

Topics

Resources

License

Stars

Watchers

Forks

Languages