👋
GoのGenericsでMapのGetOrDefault
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