golang 获取数组长度怎么获取map长度

Go语言map是怎么比较key是否存在的? - Golang中国
17:39 发布 5621 次点击
初学Go,不明白map怎么比较key是否存在的。
例如value, ok := mymap[mykey] , ok是否为真取决于mymap中是否存在一个key与mykey相等(逻辑上相等)。
在C++中,自定义的class作为std::map的key时,需要重载小于号("&"),通过判断 if( !(a&b) && !(b&a) )来比较两个key是否相同的,go语言怎么做的呢?
Anti_Magic 于
17:42 修改
应该就是key的内存的直接或者间接的比较
package main
type point struct {
func main() {
m := make(map[point]int)
p1 := point{1, 2}
p2 := point{3, 4}
p3 := point{1, 2}
m[p1] = 120
m[p2] = 340
fmt.Println(m[p1])
fmt.Println(m[p3])
这个代码2个输出都是120。
如果我的point有x,y,z三个属性,我想当x,y相等的时候就认为两个point是相等的,能否方便的实现呢?
C++重载小于号,Java貌似是重写compare方法。go呢?
go不支持重载比较操作,不过你可以把X和Z抽取出来作为map的key的结构
package main
type key struct {
type point struct {
func main() {
m := make(map[key]int)
p1 := point{key{1, 2}, 3}
p2 := point{key{3, 4}, 1}
p3 := point{key{1, 2}, 2}
m[p1.key] = 120
m[p2.key] = 340
fmt.Println(m[p1.key])
fmt.Println(m[p3.key])
懂了,刚才想错了,平时用C++的map习惯了,C++红黑树可以保存key的详细内容,go的hash表不方便保存key的额外内容的。。非常感谢!
后方可回复, 如果你还没有账号你可以
一个帐号。golang中map的值引用问题 _悬赏任务_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
golang中map的值引用问题
我需要一份与标题相关的文档
收到3篇文档
相似悬赏任务map取值与interface类型判断时的问题 - Golang中国
17:10 发布 1391 次点击
在map取值时, 可以在值后面加一个bool来判断map是否存在这个key,也可以不加直接获取这个值;在空interface{}使用的时候也有类似的情况。如var Map map[int]int
a := Map[1]a,ok := Map[1]这样都是可以的,这是什么原理?除了map和interface还有其他类似的吗?
原理就是调用不同内部函数而已。类似的还有从channel获取数据。
也就是说 go自己默认重载了 =?但是go本身又不支持重载,是这个意思吗
其实就是编译器发现不同的调用语义,然后调用不同的内部函数而已。当然你也可以认为go重载了:=,不过这个重载只能用于特定的原生类型,不能用于用户自定义数据结构。
后方可回复, 如果你还没有账号你可以
一个帐号。如何遍历 map[string]interface{}
类型的value值? - Golang中国
17:31 发布 1138 次点击
我有一段json 数据{“a”:1,”b”:2,”c”:[{“name”:”1”,”group”:”2”},{“name”:”3”,”group”:”4”}]}
使用json.Unmarshal解析后它是一个 map[string]interface{}类型的变量, 假设为 m
请问怎样才能遍历 m[“c”] ?
package main
&encoding/json&
func main() {
txt := `{&a&:1,&b&:2,&c&:[{&name&:&1&,&group&:&2&},{&name&:&3&,&group&:&4&}]}`
var m map[string]interface{}
if err := json.Unmarshal([]byte(txt), &m); err != nil {
panic(err)
v := reflect.ValueOf(m[&c&])
count := v.Len()
for i := 0; i & i++ {
fmt.Println(v.Index(i))
建议又规律的数据还是先定义好struct,反射性能不高,而且大量反射和类型断言程序可读性也不好
package main
&encoding/json&
func main() {
txt := `{&a&:1,&b&:2,&c&:[{&name&:&1&,&group&:&2&},{&name&:&3&,&group&:&4&}]}`
var m map[string]interface{}
if err := json.Unmarshal([]byte(txt), &m); err != nil {
panic(err)
for _, v := range m[&c&].([]interface{}) {
fmt.Println(v)
当然,如果结构固定,更好的方法是:
package main
&encoding/json&
func main() {
txt := `{&a&:1,&b&:2,&c&:[{&name&:&1&,&group&:&2&},{&name&:&3&,&group&:&4&}]}`
var m struct {
C []struct {
Group string
if err := json.Unmarshal([]byte(txt), &m); err != nil {
panic(err)
for _, v := range m.C {
fmt.Printf(&%+v\n&, v)
后方可回复, 如果你还没有账号你可以
一个帐号。golang笔记——map
ages := make(map[string]int) // mapping from strings to ints我们也可以用map字面值的语法创建map,同时还可以指定一些最初的key/value:ages := map[string]int{
"alice":
"charlie": 34,}这相当于ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34使用内置的delete函数可以删除元素:delete(ages, "alice") // remove element ages["alice"] Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。如果要按顺序遍历key/value对,我们必须显式地对key进行排序,可以使用sort包的Strings函数对字符串slice进行排序。简单的说,就是先遍历map,取出所有的Key存放到与map同长度的切片中,然后排序这个切片,再遍历这个切片取出map中的key即可。通过key索引方式来获取value,会返回两个值,其中第二个值是是否存在,当不存在时,第一个值则为对应value的零值。go语言没有提供 set 类型,但因为map的key也是不能重复的,所以可以通过 map 实现替代。
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 golang 获取map长度 的文章

 

随机推荐