最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言學(xué)習(xí)之映射(map)的用法詳解

 更新時(shí)間:2022年04月21日 16:17:27   作者:隱姓埋名4869  
Map是一種無序的鍵值對(duì)的集合。這篇文章主要為大家詳細(xì)介紹了Go語言中映射的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下

1. 什么是 map

Map 是一種無序的鍵值對(duì)的集合。Map 最重要的一點(diǎn)是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值

Map 是無序的,我們無法決定它的返回順序,這是因?yàn)?Map 是使用 hash 表來實(shí)現(xiàn)的

Map 是引用類型,必須初始化才能使用。其中,key的類型除了切片等引用類型,其他類型都可以;而value則可使用所有類型的值

2. 創(chuàng)建 map

可以通過make()創(chuàng)建map,它會(huì)先創(chuàng)建好底層數(shù)據(jù)結(jié)構(gòu),然后再創(chuàng)建map,并讓map指向底層數(shù)據(jù)結(jié)構(gòu)

my_map := make(map[string]int)

[string]表示map的key的數(shù)據(jù)類型

int表示key對(duì)應(yīng)的值

直接通過大括號(hào)創(chuàng)建并初始化賦值:

// 空map
my_map := map[string]string{}
 
// 初始化賦值
my_map := map[string]string{"Red": "#da1337","Orange": '#e95a22"}
 
// 格式化賦值
my_map := map[string]int{
"Java":11,
"Perl":8,
"Python":13, // 注意結(jié)尾的逗號(hào)不能少
}

注意:

其中map的key可以是任意內(nèi)置的數(shù)據(jù)類型(如int),或者其它可以通過 == 進(jìn)行等值比較的數(shù)據(jù)類型,如interface和指針可以,slice、數(shù)組、map、struct類型都不能作為key ,并且key必須唯一。

但value基本可以是任意類型,例如嵌套一個(gè)slice到map中:

my_map := map[string][]int{}

3. 訪問 map

訪問map中的元素時(shí),指定它的key即可,注意string類型的key必須加上引號(hào):

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 10,
        "2": 20,
        "3": 30,
        "4": 40,
    }
 
    //訪問
    fmt.Println(my_map["1"])
    fmt.Println(my_map)
 
    fmt.Println("")
 
    //賦值已有的key & value
    my_map["2"] = 50
    fmt.Println(my_map["2"])
    fmt.Println(my_map)
 
    fmt.Println("")
 
    //賦值新的key&value
    my_map["5"] = 66
    fmt.Println(my_map["5"])
    fmt.Println(my_map)
}

輸出結(jié)果

10
map[1:10 2:20 3:30 4:40]
50
map[1:10 2:50 3:30 4:40]
66
map[1:10 2:50 3:30 4:40 5:66]

4. nil map和空map

空map是不做任何賦值的map:

// 空map
package main
 
import "fmt"
 
func main() {
    my_map := map[string]string{}
 
    fmt.Println(my_map)
}

輸出結(jié)果

map[]

nil map,它將不會(huì)做任何初始化,不會(huì)指向任何數(shù)據(jù)結(jié)構(gòu):

// nil map
var my_map map[string]string

nil map和empty map的關(guān)系,就像nil slice和empty slice一樣,兩者都是空對(duì)象,未存儲(chǔ)任何數(shù)據(jù),但前者不指向底層數(shù)據(jù)結(jié)構(gòu),后者指向底層數(shù)據(jù)結(jié)構(gòu),只不過指向的底層對(duì)象是空對(duì)象。

使用println輸出看下即可知道:

package main
 
func main() {
    var nil_map map[string]string
    println(nil_map)
 
    emp_map := map[string]string{}
    println(emp_map)
}

輸出結(jié)果:

0x0
0xc04204de38

所以,map類型實(shí)際上就是一個(gè)指針。

5. map中元素的返回值

當(dāng)訪問map中某個(gè)元素的時(shí)候,有兩種返回值的格式:

value := my_map["key"]
value,exists := my_map["key"]

第一種很好理解,就是檢索map中key對(duì)應(yīng)的value值。如果key不存在,則value返回值對(duì)應(yīng)數(shù)據(jù)類型的0。例如int為數(shù)值0,布爾為false,字符串為空""。

第二種不僅返回key對(duì)應(yīng)的值,還根據(jù)key是否存在返回一個(gè)布爾值賦值給exists變量。所以,當(dāng)key存在時(shí),value為對(duì)應(yīng)的值,exists為true;當(dāng)key不存在,value為0(同樣是各數(shù)據(jù)類型所代表的0),exists為false。

看下例子:

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 10,
        "2": 20,
        "3": 30,
        "4": 40,
    }
    a := my_map["1"]
    b, exists1 := my_map["2"]
    c, exists2 := my_map["5"]
    fmt.Println(a)
    fmt.Println(b, exists1)
    fmt.Println(c, exists2)
}

上面將輸出如下結(jié)果:

10
20 true
0 false

在Go中設(shè)置類似于這種多個(gè)返回值的情況很多,即便是自己編寫函數(shù)也會(huì)經(jīng)常設(shè)置它的exists屬性。

6. len()和delete()

len()函數(shù)用于獲取map中元素的個(gè)數(shù),即有多個(gè)少key。delete()用于刪除map中的某個(gè)key。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 10,
        "2": 20,
        "3": 30,
        "4": 40,
    }
 
    fmt.Printf("刪除前長(zhǎng)度為%d\n", len(my_map))
    delete(my_map, "1")
    fmt.Printf("刪除后長(zhǎng)度為%d", len(my_map))
}

輸出結(jié)果如下

刪除前長(zhǎng)度為4
刪除后長(zhǎng)度為3

7. 測(cè)試map中元素是否存在

兩種方式可以測(cè)試map中是否存在某個(gè)key:

① 根據(jù)map元素的第二個(gè)返回值來判斷

② 根據(jù)返回的value是否為0(不同數(shù)據(jù)類型的0不同)來判斷

方式一:直接訪問map中的該元素,將其賦值給兩個(gè)變量,第二個(gè)變量就是元素是否存在的修飾變量。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 10,
        "2": 20,
        "3": 30,
        "4": 40,
    }
     
//方法1
/* value, exists := my_map["1"]
    if exists {
        fmt.Println("存在", value)
    }
 */
 
 
    //方法2
    if value, exists := my_map["1"]; exists {
        fmt.Printf("值存在, value=%d", value)
    }
}

輸出結(jié)果如下

值存在, value=10

方式二:根據(jù)map元素返回的value判斷。因?yàn)樵搈ap中的value部分是int類型,所以它的0是數(shù)值的0。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 10,
        "2": 20,
        "3": 30,
        "4": 40,
    }
 
    value := my_map["5"]
    if value == 0 {
        fmt.Println("不存在")
    }
}

輸出結(jié)果如下

不存在

如果map的value數(shù)據(jù)類型是string,則判斷是否為空:

package main
 
import "fmt"
 
func main() {
    my_map := map[string]string{
        "1": "book",
        "2": "games",
        "3": "computer",
    }
 
    value := my_map["5"]
    if value == "" {
        fmt.Println("不存在")
    }
}

輸出結(jié)果如下

不存在

由于map中的value有可能本身是存在的,但它的值為0,這時(shí)就會(huì)出現(xiàn)誤判斷。例如下面的"3",它已經(jīng)存在,但它對(duì)應(yīng)的值為0

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 22,
        "2": 11,
        "3": 0,
    }
 
    value := my_map["3"]
    if value == 0 {
        fmt.Println("不存在")
    }
}

輸出結(jié)果如下

不存在

所以,應(yīng)當(dāng)使用第一種方式進(jìn)行判斷元素是否存在。

8. 迭代遍歷 map

因?yàn)閙ap是key/value類型的數(shù)據(jù)結(jié)構(gòu),key就是map的index,所以range關(guān)鍵字對(duì)map操作時(shí),將返回key和value。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 22,
        "2": 11,
        "3": 0,
        "4": 55,
        "5": 66,
    }
 
    for k, v := range my_map {
        fmt.Printf("key=%s, value=%d\n", k, v)
    }
}

輸出結(jié)果如下

key=1, value=22
key=2, value=11
key=3, value=0
key=4, value=55
key=5, value=66

如果range迭代map時(shí),只給一個(gè)返回值,則表示迭代map的key:

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 22,
        "2": 11,
        "3": 0,
        "4": 55,
        "5": 66,
    }
 
    for key := range my_map {
        fmt.Println("key=", key)
    }
}

輸出結(jié)果

key= 1
key= 2
key= 3
key= 4
key= 5

9. 獲取map中所有的key

Go中沒有提供直接獲取map所有key的函數(shù)。所以,只能自己寫,方式很簡(jiǎn)單,range遍歷map,將遍歷到的key放進(jìn)一個(gè)slice中保存起來。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "Java":   11,
        "Perl":   8,
        "Python": 13,
        "Shell":  23,
    }
 
    // 保存map中key的slice
    // slice類型要和map的key類型一致
    keys := make([]string,0,len(my_map))
 
    // 將map中的key遍歷到keys中
    for map_key,_ := range my_map {
        keys = append(keys,map_key)
    }
 
    fmt.Println(keys)
}

注意上面聲明的slice中要限制長(zhǎng)度為0,否則聲明為長(zhǎng)度4、容量4的slice,而這4個(gè)元素都是空值,而且后面append()會(huì)直接對(duì)slice進(jìn)行一次擴(kuò)容,導(dǎo)致append()后的slice長(zhǎng)度為map長(zhǎng)度的2倍,前一半為空,后一般才是map中的key。

10. 傳遞map給函數(shù)

map是一種指針,所以將map傳遞給函數(shù),僅僅只是復(fù)制這個(gè)指針,所以函數(shù)內(nèi)部對(duì)map的操作會(huì)直接修改外部的map。

例如,test()用于給map的key對(duì)應(yīng)的值加1。

package main
 
import "fmt"
 
func main() {
    my_map := map[string]int{
        "1": 22,
        "2": 11,
        "3": 0,
        "4": 55,
        "5": 66,
    }
    fmt.Println("修改之前key=", my_map["3"])
    fmt.Println(my_map)
 
    fmt.Println("")
 
    test(my_map, "3")
    fmt.Println("修改之后key=", my_map["3"])
    fmt.Println(my_map)
 
}
 
func test(m map[string]int, key string) {
    m[key] += 1
}

輸出結(jié)果如下

修改之前key= 0
map[1:22 2:11 3:0 4:55 5:66]
 
修改之后key= 1
map[1:22 2:11 3:1 4:55 5:66]

到此這篇關(guān)于Go語言學(xué)習(xí)之映射(map)的用法詳解的文章就介紹到這了,更多相關(guān)Go語言映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go處理包含多種引號(hào)的字符串的幾種方法

    Go處理包含多種引號(hào)的字符串的幾種方法

    在Go中,有幾種方式可以處理包含多種引號(hào)的字符串,以確保代碼的可讀性和正確性,本文將給大家詳細(xì)介紹了這幾種處理方式,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • go中string、int、float相互轉(zhuǎn)換方式

    go中string、int、float相互轉(zhuǎn)換方式

    這篇文章主要介紹了go中string、int、float相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Golang?strings包常用字符串操作函數(shù)

    Golang?strings包常用字符串操作函數(shù)

    Golang?中的字符串統(tǒng)一使用?UTF-8?(屬于Unicode編碼的一種實(shí)現(xiàn)方式)進(jìn)行編碼,本篇文章將結(jié)合具體實(shí)例對(duì)常用的字符串操作函數(shù)進(jìn)行介紹,感興趣的可以了解一下
    2021-12-12
  • 淺談go語言閉包的立即執(zhí)行和不立即執(zhí)行

    淺談go語言閉包的立即執(zhí)行和不立即執(zhí)行

    Go語言中的閉包是一種可以訪問其定義時(shí)所在作用域變量的特殊函數(shù),閉包可以分為立即執(zhí)行和不立即執(zhí)行兩種,本文就來介紹一下go語言閉包的立即執(zhí)行和不立即執(zhí)行,感興趣的可以了解一下
    2025-03-03
  • Go語言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    Go語言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    這篇文章主要為大家介紹了Go語言metrics應(yīng)用監(jiān)控指標(biāo)的基本使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 一文搞懂Golang?值傳遞還是引用傳遞

    一文搞懂Golang?值傳遞還是引用傳遞

    最多人犯迷糊的就是?slice、map、chan?等類型,都會(huì)認(rèn)為是?“引用傳遞”,從而認(rèn)為?Go?語言的?xxx?就是引用傳遞。正因?yàn)樗鼈冞€引用類型(指針、map、slice、chan等這些),這樣就可以修改原內(nèi)容數(shù)據(jù),這篇文章主要介紹了Golang?值傳遞還是引用傳遞,需要的朋友可以參考下
    2023-01-01
  • Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音

    Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音

    這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • Go語言中定時(shí)任務(wù)庫Cron使用方法介紹

    Go語言中定時(shí)任務(wù)庫Cron使用方法介紹

    cron的意思計(jì)劃任務(wù),說白了就是定時(shí)任務(wù)。我和系統(tǒng)約個(gè)時(shí)間,你在幾點(diǎn)幾分幾秒或者每隔幾分鐘跑一個(gè)任務(wù)(job),今天通過本文給大家介紹下Go語言中定時(shí)任務(wù)庫Cron使用方法,感興趣的朋友一起看看吧
    2022-03-03
  • Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)

    Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)

    這篇文章主要為大家介紹了Go 代碼規(guī)范錯(cuò)誤處理示例實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go1.21中slog日志包用法入門

    go1.21中slog日志包用法入門

    go1.21中,slog這一被Go語言團(tuán)隊(duì)精心設(shè)計(jì)的結(jié)構(gòu)化日志包正式落地,本文將帶領(lǐng)讀者上手slog,體會(huì)其與傳統(tǒng)log的差異,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-09-09

最新評(píng)論

老河口市| 岚皋县| 沁阳市| 融水| 清镇市| 德钦县| 清水河县| 梅河口市| 洛南县| 林周县| 仁寿县| 大悟县| 重庆市| 兴业县| 镇雄县| 色达县| 定陶县| 靖江市| 团风县| 上林县| 八宿县| 虞城县| 灯塔市| 稻城县| 沂源县| 依安县| 礼泉县| 建瓯市| 肃北| 沅陵县| 万全县| 海晏县| 高青县| 喀什市| 邵武市| 宜宾县| 永吉县| 炉霍县| 通道| 三明市| 云阳县|