Golang从入门到放弃200618--Map(2)Map的排序以及值的指针

  • 参考资料
    由浅入深聊聊Golang的map
    Go夜读关于Map的资料

  • Map的知识点

    • Map是无序的,所以每次遍历的顺序随机
    • 原生的Map不支持并发读写
    • Map中 Key 必须要是被比较类型 Value 可以是任意类型
      不可被比较的 : slice、map 、 func
    • Map的底层结构是HSMap
  • Map的排序 – 核心思想就是拿到key排序后再用key取值

    	m := map[int]string{}
    	m[21] = "Henry"
    	m[21] = "Nancy"
    	m[19] = "Bob"
    	m[22] = "David"
    	m[18] = "Duck"
    	m[23] = "Ada"
    	key := make([]int, 0)
    	for k := range m {
    		key = append(key, k)
    	}
    	sort.Ints(key)
    	for i := 0; i < len(key); i++ {
    		fmt.Printf("m[%d] = %s\n",key[i],m[key[i]])
    	}
    
  • Map的寻址

    	type Person struct {
    		ID   string
    		Name string
    	}
    	func main() {
    		// map 的 value 是指针
    		perPoint := make(map[int]*Person)
    		perPoint[1] = &Person{
    			ID:   "001",
    			Name: "Henry001",
    		}
    		perPoint[2] = &Person{
    			ID:   "002",
    			Name: "Bob002",
    		}
    		fmt.Println(perPoint[1])
    
    		sPoint := perPoint[1]
    		// 更改复制后的值,也会更改原来的值 复制的值是地址
    		sPoint.ID = "003"
    		fmt.Println(perPoint)
    		fmt.Printf("%v %p\n",perPoint[1],perPoint[1])
    
    		// Map 的 value 是值
    		perValue := make(map[int]Person)
    		perValue[1] = Person{
    			ID:  "101",
    			Name: "Henry101",
    		}
    		perValue[2] =Person{
    			ID:   "102",
    			Name: "Bob102",
    		}
    		sValue := perValue[1]
    		//  更改复制之后的值,不会更改原来的值   复制的值是struct的值
    		sValue.ID = "103"
    		fmt.Println(perValue)
    		fmt.Printf("%v %s\n",perValue[1],perValue[1])
    	}
    
  • 面试题

    【中级】关于map,下面说法正确的是()
    A. map反序列化时json.unmarshal的入参必须为map的地址
    B. 在函数调用中传递map,则子函数中对map元素的增加不会导致父函数中map的修改
    C. 在函数调用中传递map,则子函数中对map元素的修改不会导致父函数中map的修改
    D. 不能使用内置函数delete删除map的元素
    
    参考答案:A
    
    【初级】使用map不需要引入任何库()
    
    参考答案:T
    
    

你可能感兴趣的:(Golang学习记录)