👋

GoのGenericsでMapのGetOrDefault

2024/10/14に公開

Goのmap[string]any(Go 1.18以前はmap[string]interface{})で空文字を取得したいのにいい感じに型変換できなかったりnilが返ってきて何もできなくなったりして大変だったのでJavaのMapにあるGetOrDefaultみたいな関数をGenerics使って書いたので残しておきます。

package main

import "fmt"

func getOrDefault[T any](m map[string]any, k string, v T) T {
	if value, exists := m[k]; exists {
		if val, ok := value.(T); ok {
			return val
		}
	}
	return v
}

func main() {
	m := map[string]any{"foo": 256, "bar": nil}
	fmt.Println(getOrDefault(m, "foo", 0))
	fmt.Println(getOrDefault(m, "bar", "default"))
	fmt.Println(getOrDefault(m, "foobar", ""))
	fmt.Println(getOrDefault(m, "foo", 0) << 8)
	fmt.Println(len(getOrDefault(m, "bar", "default")))
	fmt.Println(len(getOrDefault(m, "foobar", "")))
}
256
default

65536
7
0

Discussion