Go语言 我可以有一个函数来检查一个键是否在Map中吗?

hwamh0ep  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(89)

我想在Go中有一个像Map.containsKey()这样的函数,因为Go本身不提供这种功能,我可以在Go中有一个像MapContainsKey(someMap map[K]V, key K)这样的自定义函数吗?
我不知道如何实现它,因为据我所知,Go中还没有泛型。
我知道我能做到

if val, ok := someMap[key]; ok{
   // some code here
}

字符串
但我想把它 Package 成一个函数。

deyfvvtc

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

k4aesqcs

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
}


希望这能回答你的问题??

相关问题