summaryrefslogtreecommitdiff
path: root/content/posts/2024-08-31-01.md
blob: e2b3dfc5c0f36a044ee1a2bec6383d79d8b35db3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
---
title: "Go's unique pkg"
tags: posts
toc: true
---

https://pkg.go.dev/unique
>The unique package provides facilities for canonicalising ("interning") comparable values.[^1]
[^1]: https://pkg.go.dev/unique

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](https://en.wikipedia.org/wiki/Interning_(computer_science)). 

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
```go
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]
[^2]: https://go.dev/blog/unique

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.