a73x

high effort, low reward

← Posts

Go's unique pkg

https://pkg.go.dev/unique

The unique package provides facilities for canonicalising ("interning") comparable values.1

oh yeah, thats obvious I fully understand what this package does now, great read, tune in for the next post.

Interning, is the re-use of an object of equal value instead of creating a new one. I'm pretending I knew this but really I've just reworded Interning.

So lets try again.

If you're parsing out a csv of bank transactions, its very likely a lot of names will be repeated. Instead of allocating memory for each string representing a merchant, you can simply reuse the the same string.

So the dumbed down version might look like

var internedStrings sync.Map

func Intern(s string) string {
	if val, ok := internedStrings.Load(s); ok { 
		return val.(string) 
	} 
	internedStrings.Store(s, s) 
	return s 
}

With a small demo here https://go.dev/play/p/piSYjCHIcLr

This implementation is fairly naive, it can only grow and it only works with strings, so naturally go's implementation is a better.

It's also worth noting, that since strings are a pointer under the hood

When comparing two strings, if the pointers are not equal, then we must compare their contents to determine equality. But if we know that two strings are canonicalized, then it is sufficient to just check their pointers.2

So to recap, goes unique package provides a way to reuse objects instead of creating new ones, if we consider the objects of equal value.


  1. https://pkg.go.dev/unique ↩︎

  2. https://go.dev/blog/unique ↩︎