1. 程式人生 > 其它 >Go語言之map

Go語言之map

一、map簡介

map是key-value的資料結構,基本語法:var map 變數名 map[keytype]valuetype。

keytype可以是很多種資料型別,比如 bool、int、string、指標等,通常keytype為int和string。valuetype和keytype差不多,通常valuetype為int、string、map、struct。

舉例:

var a map[int]string // key是int型別,value是string型別
var a map[string]int // key是string型別,value是int型別
var a map[string]string //
key是string型別,value是string型別 var a map[string]map[string]string // key是string型別,value是map型別

注意:宣告是不會分配記憶體,初始化需要make,分配記憶體後才能賦值和使用。

package main

import "fmt"

func main()  {
    // 宣告map
    var a map[string]string

    // 在使用map前需要使用make分配空間
    a = make(map[string]string, 10)
    a["username"] = "張三"
    a[
"addr"] = "張家界" fmt.Println(a) // map[addr:張家界 username:張三] }
  • map在使用前一定要make
  • map的key是不能重複的,如果重複了,以最後一個key-value為準
  • map的value可以重複
  • map的key-value是無序的

二、map的建立

1、方式一

package main

import "fmt"

func main()  {

    // 建立map的方式一 先進行make
    var m1 map[string]string
    m1 = make(map[string]string, 10)
    m1[
"usernamae"] = "張三" m1["password"] = "abc123456" fmt.Println(m1) }

2、方式二

package main

import "fmt"

func main()  {
    
    // 建立map的方式二
    m2 := make(map[string]string)
    m2["usernamae"] = "張三"
    m2["password"] = "abc123456"
    fmt.Println(m2)

}

3、方式三

package main

import "fmt"

func main()  {
    
    // 建立map的方式三
    m3 := map[string]string{
        "username": "張三",
        "password": "abc123",
    }
    fmt.Println(m3)

}

三、map的增、刪、查、改

1、增加和修改

package main

import "fmt"

func main()  {
    
    user := map[string]string{
        "username": "iveBoy",
    }

    // 增加,如果key沒有,就是增加
    user["password"] = "abc123456"

    // 修改,如果key存在,就是修改
    user["username"] = "lily"

    fmt.Println(user)

}

2、刪除

delete(map, "key"),delete是一個內建函式,如果key存在,就刪除該key-value,如果key不存在,不操作並且也不會報錯。

package main

import "fmt"

func main()  {
    user := map[string]string{
        "username": "iveBoy",
        "gender": "male",
    }

    // 刪除鍵值
    delete(user, "gender")
    fmt.Println(user) // map[username:iveBoy]

    //  刪除不存在的鍵, 刪除不操作,也不會報錯
    delete(user, "hobby")
    fmt.Println(user)
}

如果需要清空整個map,通過:

  • 迴圈一個個刪除
  • make一個新的map,讓之前的那個成為垃圾,gc進行回收

3、查詢

package main

import "fmt"


func main()  {
    
    user := map[string]string{
        "username": "iveBoy",
        "gender": "male",
    }

    val, isFlag := user["username"]

    fmt.Println(val, isFlag) // iveBoy true
}

如果user中存在username這個鍵,isFlag就是true,否則就為false。

對於map的遍歷:

package main

import "fmt"

func main()  {
    
    // 宣告一個map

    user := map[string]string{

        "username": "iveBoy",
        "gender": "male",
    }

    for k, v := range user {
        fmt.Printf("k=%v v=%v\n", k, v)
    }
    /*
    k=username v=iveBoy
    k=gender v=male
    */

}

如果計算map的長度可以通過len方法進行獲取,len(user)。

四、map切片

之前學習過陣列切片,那麼map切片應該就知道是什麼意思了,對的,通過map切片可以使map的個數動態變化。舉個例子,一個班級有很多學生,而每個學生有自己的姓名、性別等資訊,那麼班級可以定義成一個切片,每個學生就是一個map。

package main

import "fmt"

func main()  {
    
    // 定義切片
    class := make([]map[string]string, 2) //可以放入2個學生資訊

    // 增加第一個學生,先提前判斷是否存在這個map
    if class[0] == nil {
        class[0] = make(map[string]string)
        class[0]["name"] = "張三"
        class[0]["gender"] = "男"
    }

    // 增加第二個學生,先提前判斷是否存在這個map
    if class[1] == nil {
        class[1] = make(map[string]string)
        class[1]["name"] = "李四"
        class[1]["gender"] = "男"
    }

    // 此時只能動態新增map了,否則會越界
    newStu1 := map[string]string{
        "name": "王五",
        "gender": "男",
    }

    class = append(class, newStu1)

    fmt.Println(class)
    
    /*
    [map[gender:男 name:張三] map[gender:男 name:李四] map[gender:男 name:王五]]
    */

}

五、map其它注意事項

1、map排序

golang中沒有專門的方法針對map的key進行排序,所以map是無序的,如果想讓其有序可以先將map的key放入切片中進行排序,然後對應輸出對應的value。

package main

import (
    "fmt"
    "sort"
    )

func main()  {
    
    m1 := make(map[int]int, 5)
    m1[1] = 5
    m1[3] = 10
    m1[0] = 60

    // 定義一個切片
    var keys []int

    for k, _ := range m1{
        keys = append(keys, k)
    }

    // 對key進行排序
    sort.Ints(keys)

    fmt.Println(keys)

    // 根據key輸出value
    for _, k := range keys{
        fmt.Println("value=", m1[k])
    }
    

}

2、map引用型別

map是引用型別,如果函式引數是map型別,那麼在函式裡面修改的map,外面也會發生變化。

package main

import "fmt"

func modifyValue(m map[int]int)  {
    m[1] = 10
}

func main()  {
    
    m2 := map[int]int{
        1: 6,
        2: 9,
    }

    // 修改map值
    modifyValue(m2)

    fmt.Println(m2)
    /* map[1:10 2:9] */
}
作者:iveBoy 出處:http://www.cnblogs.com/shenjianping/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連線,否則保留追究法律責任的權利。