• 辉仔lovers
    2019-03-08
    老师:您好,请教个问题,make方式来创建map的时候传递了第二个参数capcity的作用是什么,是为了当map的长度超过capcity的时候自动扩容吗?其他方式初始化map的时候,是不是底层默认了一个初始容量呢?map的底层数据结构是类似于java中hashmap的哈希表吗?

    作者回复: capacity是设置初始化容量,map会自动扩容,但扩容会导致内存分配和数据复制,所以如果能够初始化到比较适合的capacity,可以提高性能。

     1
     3
  • 阿鹏
    2019-03-07
    因为值是int类型,所以默认是0,如果换成string类型,默认就是空字符串了
     1
     3
  • 碧雪天虹
    2019-10-17
    看到一些同学说排序, 我也尝试了一下, 步骤上就是把key都存储到slice里面, 然后给key排序, 在遍历key并打印值.

    func TestSortByKey(t *testing.T) {
        m1 := map[string]int{"aa": 1, "zz": 2, "bb": 3, "yy": 4, "cc": 5, "xx": 6}
        s1 := make([]string, 0, len(m1))
        for k, _ := range m1 {
            s1 = append(s1, k)
        }
        sort.Strings(s1)
        for _, k := range s1 {
            t.Log(k, m1[k])
        }
    }
    展开
    
     1
  • butterfly
    2019-04-08
    map中的key,如何使用对象作为key.
    现在项目中都是使用一个string作为key,但有时一个string是不够的,有时需要某个对象中的两个属性来决定map中的key是否相等.像c++中map是需要一个hash函数和equal函数来判断的.
    Golang中如何处理呢?
    比如有一个对象 Person定义如下, 有这样一个map[Person]string,同时使用 person中的name和age决定一个对象是否重复,进行hash等.
    type Person struct {
     name string
     age int
    sex string
    }
    展开
    
     1
  • 打豆豆
    2019-04-08
    老师,如果我的map想有序输出的话,该怎么办呢
    m2:= map[int]int{1:1,2:2,3:3,4:4}
        for k,v:=range m2{
            t.Log(k,v)
        }

        for i:=0;i<len(m2);i++{
            t.Log("--",m2[?])
        }

    定义了上面的代码,再用for ++循环的时候,没法用index
    展开
    
     1
  • 大王叫我来巡山
    2019-03-13
    非常感谢老师,作为软件开发行业的老鸟,写go语言有段时间,依然能有所收获,学习就是个不断交流的过程,我们在每一次交流中都能收获心得体会,对学习常怀敬畏之心,对同行怀谦卑之心。

    作者回复: 谢谢你的鼓励!让我们大家持续学习!

    
     1
  • 卡卡
    2019-12-08
    老师,你好,为什么我的IDE运行go run或者go test的时候得3秒多的时间才能出结果,感觉应该秒出的,很简单的测试程序
    
    
  • 码农Kevin亮
    2019-11-26
    请问老师,既然map的取值是返回两个值,那么为什么打印语句来打印map取值时只会输出值,而不会把ok的布尔值也输出了呢?

    作者回复: fmt的输出在默认情况下是调用类型的String方法的,这样就是说map的String方法里没有输出ok这个值

    
    
  • 碧雪天虹
    2019-10-17
    课程中没有说怎么删除key, 网络找资料试验了一下, 通过delete方法可以删除map中的元素

    func TestAccessNotExistingKey(t *testing.T) {
        m1 := map[int]int{}
        t.Log(m1[1])
        m1[2] = 0
        t.Log(m1[2])
        printKey3Exists(&m1, t)
        m1[3] = 0
        printKey3Exists(&m1, t)
        delete(m1, 3)
        printKey3Exists(&m1, t)
    }

    func printKey3Exists(m *map[int]int, t *testing.T) {
        if v, ok := (*m)[3]; ok {
            t.Logf("key 3's value is %d", v)
        } else {
            t.Log("key 3 is not existing.")
        }
    }
    展开
    
    
  • 蒙晓蒙
    2019-03-18

    func TestMapVal(t *testing.T) {
        var m = map[string]int {"one":1,"two":2,"three":3,"four":4,"five":5}
        for k,v:=range m {
            t.Log(k,v)
        }
    }
    运行后输出值为:
           Map_test.go:25: four 4
            Map_test.go:25: five 5
            Map_test.go:25: one 1
            Map_test.go:25: two 2

    想问下为什么是这种输出顺序
    展开

    作者回复: map底成是通过hash来指定存储位置的,不是有序的

    
    
  • 行军伙夫
    2019-03-18
    老师你好,我初始化了map[string]int { "1": 1, "2": 4, "3": 9, "4": 16 },当我用range进行遍历的时候,输出的结果并没有按照 1 1 , 2 4, 3 9, 4 16的顺序进行输出,我想问问range遍历有自定义排序嘛

    作者回复: map的底成采用hash表机制,不是有序的

     1
    
  • Steven Fung
    2019-03-17
    nil slice和nil map是在哪里用的,只查到nil slice时在返回值是slice的时候用到,其他地方会用到吗?map呢?
    
    
  • Steven Fung
    2019-03-17
    “capacity是设置初始化容量,map会自动扩容,但扩容会导致内存分配和数据复制”,总觉得map也是有容量大小的,但是为什么cap函数不能获取map的容量?
    
    
我们在线,来聊聊吧