Skip to content

Instantly share code, notes, and snippets.

@dhermes
Created January 11, 2023 17:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dhermes/c7737c8db526c013c253c5adc80e46ae to your computer and use it in GitHub Desktop.
Save dhermes/c7737c8db526c013c253c5adc80e46ae to your computer and use it in GitHub Desktop.
[2023-01-11] Don't use pointers in structs used for Go map keys (or know what you're getting into)
package main
import (
"fmt"
"os"
"github.com/google/uuid"
)
type mapKey struct {
SubscriptionID uuid.UUID
SiteID uuid.NullUUID
}
type mapKeyBad struct {
SubscriptionID uuid.UUID
SiteID *uuid.UUID
}
func run() error {
u1, err := uuid.Parse("0b9fbf97-924e-465a-8913-b1bdd35251c9")
if err != nil {
return err
}
u2, err := uuid.Parse("4417a084-2686-445d-8178-3fa7a6422bf9")
if err != nil {
return err
}
u3 := uuid.NullUUID{UUID: u2, Valid: true}
u4 := uuid.NullUUID{Valid: false}
k1 := mapKey{SubscriptionID: u1, SiteID: u3}
k2 := mapKey{SubscriptionID: u2, SiteID: u3}
k3 := mapKey{SubscriptionID: u1, SiteID: u4}
k4 := mapKey{SubscriptionID: u2, SiteID: u4}
m := map[mapKey]int{k1: 11, k2: 23, k3: 37, k4: 41}
k5 := mapKey{SubscriptionID: u1, SiteID: u3}
fmt.Println(m[k5])
u5 := uuid.NullUUID{UUID: u1, Valid: true}
k6 := mapKey{SubscriptionID: u2, SiteID: u5}
fmt.Println(m[k6])
/////////
u2Copy, err := uuid.Parse("4417a084-2686-445d-8178-3fa7a6422bf9")
if err != nil {
return err
}
kb1 := mapKeyBad{SubscriptionID: u1, SiteID: &u2}
kb2 := mapKeyBad{SubscriptionID: u1, SiteID: &u2Copy}
mb := map[mapKeyBad]int{kb1: 11, kb2: 23}
fmt.Println(mb)
return nil
}
func main() {
err := run()
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
}
@dhermes
Copy link
Author

dhermes commented Jun 30, 2023

Output:

11
0
map[{0b9fbf97-924e-465a-8913-b1bdd35251c9 4417a084-2686-445d-8178-3fa7a6422bf9}:11 {0b9fbf97-924e-465a-8913-b1bdd35251c9 4417a084-2686-445d-8178-3fa7a6422bf9}:23]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment