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