Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 我可以有一个功能来检查地图上是否有钥匙吗?_Dictionary_Go - Fatal编程技术网

Dictionary 我可以有一个功能来检查地图上是否有钥匙吗?

Dictionary 我可以有一个功能来检查地图上是否有钥匙吗?,dictionary,go,Dictionary,Go,我想在Go中有一个像Map.containsKey这样的函数,因为Go本身不提供这种功能,我也可以有一个像MapContaineskeySomeMap[K]V这样的自定义函数,在Go中输入K键吗 我不知道如何实现它,因为据我所知,Go中还没有泛型 我知道我能行 if val, ok := someMap[key]; ok{ // some code here } 但是我想把它包装成一个函数。你可以创建一个使用反射的函数,并且是泛型的,但是速度会慢一些。在围棋中,你只需写下你已经拥有的东西

我想在Go中有一个像Map.containsKey这样的函数,因为Go本身不提供这种功能,我也可以有一个像MapContaineskeySomeMap[K]V这样的自定义函数,在Go中输入K键吗

我不知道如何实现它,因为据我所知,Go中还没有泛型

我知道我能行

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

但是我想把它包装成一个函数。

你可以创建一个使用反射的函数,并且是泛型的,但是速度会慢一些。在围棋中,你只需写下你已经拥有的东西。干净、快速、可读。Go不是Java

为了演示,下面是它的样子。省略类型检查。例如,如果您传递的是非映射,或者传递的键值的类型与映射的键类型不匹配,则会导致死机:

func containsKey(m, k interface{}) bool {
    v := reflect.ValueOf(m).MapIndex(reflect.ValueOf(k))
    return v != reflect.Value{}
}
测试它的示例:

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不是Java

为了演示,下面是它的样子。省略类型检查。例如,如果您传递的是非映射,或者传递的键值的类型与映射的键类型不匹配,则会导致死机:

func containsKey(m, k interface{}) bool {
    v := reflect.ValueOf(m).MapIndex(reflect.ValueOf(k))
    return v != reflect.Value{}
}
测试它的示例:

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))
请在以下服务器上尝试输出:


正如你所说,有这样的解决方案:

if _, ok := aMap[key]; ok {
  // bla bla bla
}
如果要将其包装到函数中,请执行以下操作:

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
}

我希望这能回答您的问题正如您所说,有这样的解决方案:

if _, ok := aMap[key]; ok {
  // bla bla bla
}
如果要将其包装到函数中,请执行以下操作:

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
}

我希望这能回答您的问题,您可以编写独立函数,或者您可以将其作为方法附加到类型,比如:我想将其包装到函数中-为什么?你想解决的核心问题是什么?Go可能很快就会有参数多态性,你称之为泛型。有一个名为go2go的编译器附带的支持此功能的初步预编译器,尽管它可能会在正式发布之前更改。我已经试过了,它完全符合你所说的。@AJR:不久的某个时候,我相信你的意思是可能在18-24个月后,在Go 2中?@Flimzy就像我想知道的那样,如果lensomeArray>1&&someMap.containssomeArray[1],我必须确保someArray具有索引1的值,然后再检查someMap中是否存在该值。如果lensomeArray>1&&,我无法在if语句中执行此操作,ok:=someMap[someArray[1]];OK您可以编写独立函数,也可以将其作为方法附加到类型,如:我想将其包装在函数中-为什么?你想解决的核心问题是什么?Go可能很快就会有参数多态性,你称之为泛型。有一个名为go2go的编译器附带的支持此功能的初步预编译器,尽管它可能会在正式发布之前更改。我已经试过了,它完全符合你所说的。@AJR:不久的某个时候,我相信你的意思是可能在18-24个月后,在Go 2中?@Flimzy就像我想知道的那样,如果lensomeArray>1&&someMap.containssomeArray[1],我必须确保someArray具有索引1的值,然后再检查someMap中是否存在该值。如果lensomeArray>1&&,我无法在if语句中执行此操作,ok:=someMap[someArray[1]];好啊