Golang-map、map切片


Golang-map

  map 的基本介紹

    map 是 key-value 數據結構,又稱為字段或者關聯數組。類似其它編程語言的集合,在編程中是經常使用到


  map 的聲明

    var map 變量名 map[keytype]valuetype

    key 可以是什么類型
    golang 中的 map,的 key 可以是很多種類型,比如 bool, 數字,string, 指針, channel , 還可以是只包含前面幾個類型的 接口, 結構體, 數組
    通 常 key 為 int 、 string
    注意: slice, map 還有 function 不可以,因為這幾個沒法用 == 來判斷

    valuetype 可以是什么類型
    valuetype 的類型和 key 基本一樣,這里我就不再贅述了通常為: 數字(整數,浮點數),string,map,struct


  map 聲明的舉例:
    var a map[string]string

    var a map[string]int

    var a map[int]string
    var a map[string]map[string]string
    注意:聲明是不會分配內存的,初始化需要 make ,分配內存后才能賦值和使用。案例演示:

             

      對上面代碼的說明
      1)map 在使用前一定要 make
      2)map 的 key 是不能重復,如果重復了,則以最后這個 key-value 為准
      3)map 的 value 是可以相同的.
      4)map 的 key-value 是無序
      5)make 內置函數數目

        

 

 

   map 的使用

    方式一

      

 

 

     方式二

      

 

 

     方式三

      

 

 

   

  map 使用的課堂案例
    課堂練習:演示一個 key-value 的 value 是 map 的案例
    比如:我們要存放 3 個學生信息, 每個學生有 name 和 sex 信息思路: map[string]map[string]string
    代碼:

      

 

   

  map 的增刪改查操作
    map 增加和更新:
      map["key"] = value //如果 key 還沒有,就是增加,如果 key 存在就是修改。

      

 

     

    map 刪除: 說明:
      delete(map,"key") ,delete 是一個內置函數,如果 key 存在,就刪除該 key-value,如果 key 不存在, 不操作,但是也不會報錯

        

 

       

      細節說明
      如果我們要刪除 map 的所有 key ,沒有一個專門的方法一次刪除,可以遍歷一下 key, 逐個刪除或者 map = make(...),make 一個新的,讓原來的成為垃圾,被 gc 回收

      

 

     map 查找: 案例演示:

      

      對上面代碼的說明:
      說明:如果 heroes 這個 map 中存在 "no1" , 那么 findRes 就會返回 true,否則返回 false

  

  map 遍歷:
    案例演示相對復雜的 map 遍歷:該 map 的 value 又是一個 map
    說明:map 的遍歷使用 for-range 的結構遍歷

       

 

   

  map 的長度

    

 

 

map 切片

  基本介紹
    切片的數據類型如果是 map,則我們稱為 slice of map,map 切片,這樣使用則 map 個數就可以動態變化了。
  案例演示
    要求:使用一個 map 來記錄 monster 的信息 name 和 age, 也就是說一個 monster 對應一個 map,並且妖怪的個數可以動態的增加=>map 切片

    

 

   

 map 排序
  1)golang 中沒有一個專門的方法針對 map 的 key 進行排序
  2)golang 中的 map 默認是無序的,注意也不是按照添加的順序存放的,你每次遍歷,得到的輸出可能不一樣. 【案例演示 1】
  3)golang 中 map 的排序,是先將 key 進行排序,然后根據 key 值遍歷輸出即可
  案例演示

     

 

 

map 使用細節

  1)map 是引用類型,遵守引用類型傳遞的機制,在一個函數接收 map,修改后,會直接修改原來的 map 【案例演示】
  2)map 的容量達到后,再想 map 增加元素,會自動擴容,並不會發生 panic,也就是說 map 能

    

  3)map 的 value 也經常使用 struct 類型,更適合管理復雜的數據(比前面 value 是一個 map 更好),

  比如 value 為 Student 結構體 【案例演示,因為還沒有學結構體,體驗一下即可】

    

 

 

map 的課堂練習題
  1)使 用 map[string]map[string]sting 的 map 類 型
  2)key: 表示用戶名,是唯一的,不可以重復
  3)如果某個用戶名存在,就將其密碼修改"888888",如果不存在就增加這個用戶信息,(包括昵稱nickname 和 密碼 pwd)。
  4)編寫一個函數 modifyUser(users map[string]map[string]sting, name string) 完成上述功能

  代碼實現

package main 

import "fmt"

// 1)使用 map[string]map[string]sting  的 map 類型
// 2)key: 表示用戶名,是唯一的,不可以重復
// 3)如果某個用戶名存在,就將其密碼修改"888888",如果不存在就增加這個用戶信息,
// (包括昵稱 nickname 和 密碼 pwd)。
// 4)編寫一個函數 modifyUser(users map[string]map[string]sting, name string) 完成上述功能

func modifyUser(users map[string]map[string]string, name string) {

	//判斷 users 中是否有 name
	//v , ok := users[name] 
	if users[name] != nil {
		//有這個用戶
		users[name]["pwd"] = "888888"
	} else {
		//沒有這個用戶
		users[name] = make(map[string]string, 2) users[name]["pwd"] = "888888"
		users[name]["nickname"] = "昵稱~" + name //示意
	}
}

func main() {
	
	users := make(map[string]map[string]string, 10) users["smith"] = make(map[string]string, 2) users["smith"]["pwd"] = "999999"
	users["smith"]["nickname"] = "小花貓"

	modifyUser(users, "tom") modifyUser(users, "mary") modifyUser(users, "smith")
	fmt.Println(users)
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM