我想在Go中有一个像Map.containsKey()这样的函数,因为Go本身不提供这种功能,我可以在Go中有一个像MapContainsKey(someMap map[K]V, key K)这样的自定义函数吗?我不知道如何实现它,因为据我所知,Go中还没有泛型。我知道我能做到
Map.containsKey()
MapContainsKey(someMap map[K]V, key K)
if val, ok := someMap[key]; ok{ // some code here }
字符串但我想把它 Package 成一个函数。
deyfvvtc1#
从Go 1.18开始,你可以创建一个泛型函数。
func containsKey[M ~map[K]V, K comparable, V any](m M, k K) bool { _, ok := m[k] return ok }
字符串测试它的示例:
m1 := map[string]int{"one": 1, "x": 0} fmt.Println(containsKey(m1, "one")) fmt.Println(containsKey(m1, "x")) fmt.Println(containsKey(m1, "two")) m2 := map[int]string{1: "one", 9: ""} fmt.Println(containsKey(m2, 1)) fmt.Println(containsKey(m2, 9)) fmt.Println(containsKey(m2, 2))
型输出(在Go Playground上尝试):
true true false true true false
型
k4aesqcs2#
正如你所说,有这样的解决方案:
if _, ok := aMap[key]; ok { // bla bla bla }
字符串如果你想把它 Package 在一个函数中,那么就做这个函数:
type ( myMap1 map[int]string myMap2 map[string]string ) func (m myMap1) Contains(k int) (ok bool) { _, ok = m[k] return } func (m myMap2) Contains(k string) (ok bool) { _, ok = m[k] return } func main() { m1 := make(myMap1) m2 := make(myMap2) m1[10] = "Hello" m2["Hi"] = "こんにちは" fmt.Println(m1.Contains(9)) // false fmt.Println(m1.Contains(10)) // true fmt.Println(m2.Contains("Hello")) // false fmt.Println(m2.Contains("Hi")) // true }
型希望这能回答你的问题??
2条答案
按热度按时间deyfvvtc1#
从Go 1.18开始,你可以创建一个泛型函数。
字符串
测试它的示例:
型
输出(在Go Playground上尝试):
型
k4aesqcs2#
正如你所说,有这样的解决方案:
字符串
如果你想把它 Package 在一个函数中,那么就做这个函数:
型
希望这能回答你的问题??