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

Go中map數(shù)據(jù)類型的實(shí)現(xiàn)

 更新時(shí)間:2024年12月26日 09:34:31   作者:米飯好好吃.  
本文介紹了Go語(yǔ)言中的map數(shù)據(jù)類型,用于高效地存儲(chǔ)和管理鍵值對(duì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 前言

本篇博客將會(huì)介紹Go語(yǔ)言當(dāng)中的另一大核心數(shù)據(jù)類型——map(映射),當(dāng)然在介紹這個(gè)數(shù)據(jù)類型之前我們還是要思考引入這個(gè)數(shù)據(jù)類型的原因:

? 需求:要求完成對(duì)一個(gè)班級(jí)所有同學(xué)的信息管理(包括但不限于增刪改查),主要字段有名字,編號(hào)并且能夠根據(jù)編號(hào)快速修改對(duì)應(yīng)同學(xué)的信息

在我們學(xué)習(xí)map之前,我們唯一學(xué)過(guò)的收集器類型就是數(shù)組與切片,那么可以通過(guò)下面的代碼完成上述功能:

// 定義學(xué)生姓名
var stuNameArr = []string{"zhangsan", "lisi", "wangwu"}
var stuIdArr = []string{"1001", "1002", "1003"}
// 修改編號(hào)為1001的同學(xué)姓名為zhangyi
var targetIndex = -1
for index, id := range stuIdArr {
    if id == "1001" {
        targetIndex = index
        break
    }
}
stuNameArr[targetIndex] = "zhangyi"
fmt.Println(stuNameArr)

從上述代碼我們可以看出,我們只能通過(guò)兩個(gè)切片分別存儲(chǔ)學(xué)生的姓名和編號(hào),當(dāng)需要修改某個(gè)特定學(xué)生的信息時(shí),我們還需要查找出目標(biāo)學(xué)生的存儲(chǔ)下標(biāo),并根據(jù)該下標(biāo)修改其余切片的信息。

?? 缺點(diǎn):上述代碼歸根到底沒(méi)有做到對(duì)學(xué)生信息的統(tǒng)一管理,并且實(shí)際上學(xué)生的編號(hào)與姓名之間應(yīng)該存在著某種對(duì)應(yīng)關(guān)系,不應(yīng)該依賴于下標(biāo)進(jìn)行間接關(guān)聯(lián),而是應(yīng)該存在直接關(guān)聯(lián)關(guān)系!于是引入了我們的映射類型——map

2. map類型

2.1 map簡(jiǎn)介

Map:Go語(yǔ)言當(dāng)中的map是一種**Key(鍵)-Value(值)**結(jié)構(gòu)的數(shù)據(jù)類型,可以通過(guò)key快速定位到value值,事實(shí)上很多編程語(yǔ)言都有對(duì)應(yīng)的Key-Value結(jié)構(gòu),比如Python當(dāng)中的字典、JavaScript當(dāng)中的object

?? 數(shù)組與映射的區(qū)別:

數(shù)組是連續(xù)存儲(chǔ)的,但是map其底層實(shí)現(xiàn)決定了它是隨機(jī)存儲(chǔ)的

數(shù)組可以通過(guò)下標(biāo)index訪問(wèn)某個(gè)元素值,但是map當(dāng)中只能通過(guò)key訪問(wèn)對(duì)應(yīng)的value元素值

2.2 map的聲明和初始化

map是一個(gè)引用類型,其聲明語(yǔ)法如下:

var map_name map[key_type]value_type

其中:

  • map_name:變量名稱
  • key_type:鍵的類型
  • value_type:值的類型

2.2.1 初始化方式1

初始化方式1:先聲明后賦值

由于map也是一個(gè)引用數(shù)據(jù)類型,因此如果聲明未賦值時(shí)不會(huì)開(kāi)辟空間,也不會(huì)進(jìn)行初始化,同樣需要通過(guò)make函數(shù)進(jìn)行初始化,語(yǔ)法如下:

var map_name = make(map[key_type]value_type)

// 先聲明
var stu = make(map[string]string)
// 再賦值
stu["name"] = "zhangsan"
stu["age"] = "21"
fmt.Println(stu)

? 注意:

map當(dāng)中的鍵是無(wú)序的,因此每次打印的順序不一定相同

map當(dāng)中的鍵是唯一的、不重復(fù)的

2.2.2 初始化方式2

初始化方式2:使用符合字面量聲明并賦值

語(yǔ)法如下:

var map_name = map[key_type]value_type{"key1": value1, "key2": value2...}
// 聲明并賦值
var stuMap = map[string]string{"name": "zhansgan", "age": "21"}
fmt.Println(stuMap)

2.3 map常見(jiàn)操作

2.3.1 新增

語(yǔ)法格式:map_name[key] = value

如果在map當(dāng)中沒(méi)有對(duì)應(yīng)的key時(shí)就會(huì)進(jìn)行新增

// map的新增操作
var stuMap = make(map[string]string)
stuMap["name"] = "zhangsan"
stuMap["age"] = "21"
fmt.Println(stuMap)

程序運(yùn)行結(jié)果:

2.3.2 修改

語(yǔ)法格式:map_name[key] = value

與新增操作不同:當(dāng)map中已經(jīng)有該key鍵時(shí),就會(huì)將對(duì)應(yīng)的value進(jìn)行修改

// map的修改操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhangsan"
fmt.Println(stuMap)
// 修改name
stuMap["name"] = "lisi"
fmt.Println(stuMap)

程序運(yùn)行結(jié)果:

2.3.3 查詢

語(yǔ)法格式:var value, exists = map_name[key]

  • 如果對(duì)應(yīng)的key存在則value存儲(chǔ)對(duì)應(yīng)值,exists值為true
  • 如果對(duì)應(yīng)的key不存在則value為空,exists值為false
// map的查詢操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
// 查詢name
name, exists := stuMap["name"]
if exists {
    fmt.Println("name值為: " + name)
} else {
    fmt.Println("name不存在!")
}
// 查詢age
age, exists := stuMap["age"]
if exists {
    fmt.Println("age值為: " + age)
} else {
    fmt.Println("age不存在!")
}

程序運(yùn)行結(jié)果:

2.3.4 刪除

語(yǔ)法格式:delete(map_name, key)

map的刪除則需要使用到內(nèi)置delete函數(shù),第一個(gè)參數(shù)為map對(duì)象,第二個(gè)參數(shù)為待刪除的key值

// map的刪除操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
fmt.Println(stuMap)
// 刪除name
delete(stuMap, "name")
fmt.Println(stuMap)

程序運(yùn)行結(jié)果:

2.3.5 遍歷

語(yǔ)法格式:for k, v := range map_name {}

與數(shù)組切片不同,數(shù)組切片既可以通過(guò)索引下標(biāo)進(jìn)行遍歷,也可以通過(guò)range迭代遍歷。但是map沒(méi)有索引這個(gè)概念,因此只能通過(guò)range進(jìn)行迭代遍歷

// map的遍歷操作
var stuMap = make(map[string]string)
// 新增name,age,id
stuMap["name"] = "zhansgan"
stuMap["age"] = "21"
stuMap["id"] = "1001"
// range遍歷
for k, v := range stuMap {
    fmt.Println(k, v)
}

程序運(yùn)行結(jié)果:

到此這篇關(guān)于Go中map數(shù)據(jù)類型的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go map數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語(yǔ)言開(kāi)發(fā)任務(wù)待辦清單Web應(yīng)用

    使用Go語(yǔ)言開(kāi)發(fā)任務(wù)待辦清單Web應(yīng)用

    在學(xué)習(xí) Go 的過(guò)程中,一個(gè)非常適合入門(mén)的 Web 項(xiàng)目就是 TodoList(任務(wù)待辦清單),本文將為大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法,希望對(duì)大家有所幫助
    2025-09-09
  • Go語(yǔ)言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    Go語(yǔ)言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    反射是Go語(yǔ)言的一個(gè)強(qiáng)大特性,它允許程序在運(yùn)行時(shí)檢查和操作變量、接口和結(jié)構(gòu)體,本文就來(lái)詳細(xì)的介紹一下Go語(yǔ)言的反射機(jī)制的實(shí)現(xiàn),感興趣的可以了解一下
    2026-04-04
  • go語(yǔ)言對(duì)文件按照指定塊大小進(jìn)行分割的方法

    go語(yǔ)言對(duì)文件按照指定塊大小進(jìn)行分割的方法

    這篇文章主要介紹了go語(yǔ)言對(duì)文件按照指定塊大小進(jìn)行分割的方法,實(shí)例分析了Go語(yǔ)言文件操作的技巧,需要的朋友可以參考下
    2015-03-03
  • 淺析go中的map數(shù)據(jù)結(jié)構(gòu)字典

    淺析go中的map數(shù)據(jù)結(jié)構(gòu)字典

    golang中的map是一種數(shù)據(jù)類型,將鍵與值綁定到一起,底層是用哈希表實(shí)現(xiàn)的,可以快速的通過(guò)鍵找到對(duì)應(yīng)的值。這篇文章主要介紹了go中的數(shù)據(jù)結(jié)構(gòu)字典-map,需要的朋友可以參考下
    2019-11-11
  • Golang二進(jìn)制反匯編問(wèn)題

    Golang二進(jìn)制反匯編問(wèn)題

    這篇文章主要介紹了Golang二進(jìn)制反匯編問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Golang字符串變位詞示例詳解

    Golang字符串變位詞示例詳解

    這篇文章主要給大家介紹了關(guān)于GoLang字符串變位詞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 源碼分析Go語(yǔ)言中g(shù)ofmt實(shí)現(xiàn)原理

    源碼分析Go語(yǔ)言中g(shù)ofmt實(shí)現(xiàn)原理

    gofmt?是?Go?語(yǔ)言官方提供的一個(gè)工具,用于自動(dòng)格式化?Go?源代碼,使其符合?Go?語(yǔ)言的官方編碼風(fēng)格,本文給大家源碼詳細(xì)分析了Go語(yǔ)言中g(shù)ofmt實(shí)現(xiàn)原理,并通過(guò)圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)

    Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)

    這篇文章主要介紹了Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Windows上安裝Go并配置環(huán)境變量(圖文步驟)

    Windows上安裝Go并配置環(huán)境變量(圖文步驟)

    開(kāi)始使用Go創(chuàng)建應(yīng)用程序之前,需要設(shè)置開(kāi)發(fā)環(huán)境,本文主要介紹了Windows上安裝Go并配置環(huán)境變量,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Golang對(duì)MongoDB數(shù)據(jù)庫(kù)的操作簡(jiǎn)單封裝教程

    Golang對(duì)MongoDB數(shù)據(jù)庫(kù)的操作簡(jiǎn)單封裝教程

    mongodb官方?jīng)]有關(guān)于go的mongodb的驅(qū)動(dòng),因此只能使用第三方驅(qū)動(dòng),mgo就是使用最多的一種。下面這篇文章主要給大家介紹了關(guān)于利用Golang對(duì)MongoDB數(shù)據(jù)庫(kù)的操作簡(jiǎn)單封裝的相關(guān)資料,需要的朋友可以參考下
    2018-07-07

最新評(píng)論

巴塘县| 临夏市| 潼关县| 保定市| 镇坪县| 独山县| 二连浩特市| 东莞市| 黎城县| 宜章县| 宜宾县| 论坛| 宜丰县| 民和| 大方县| 健康| 利辛县| 井陉县| 青田县| 九寨沟县| 铁岭县| 孟津县| 隆昌县| 贡觉县| 东乡族自治县| 新兴县| 黄骅市| 隆尧县| 北宁市| 鄂伦春自治旗| 镇江市| 武穴市| 金沙县| 渑池县| 鄱阳县| 响水县| 梅河口市| 巴彦淖尔市| 汾西县| 宜君县| 潢川县|