欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 前言

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

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

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

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

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

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

2. map類型

2.1 map簡介

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

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

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

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

2.2 map的聲明和初始化

map是一個引用類型,其聲明語法如下:

var map_name map[key_type]value_type

其中:

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

2.2.1 初始化方式1

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

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

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)中的鍵是無序的,因此每次打印的順序不一定相同

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

2.2.2 初始化方式2

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

語法如下:

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常見操作

2.3.1 新增

語法格式:map_name[key] = value

如果在map當(dāng)中沒有對應(yīng)的key時就會進行新增

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

程序運行結(jié)果:

2.3.2 修改

語法格式:map_name[key] = value

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

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

程序運行結(jié)果:

2.3.3 查詢

語法格式:var value, exists = map_name[key]

  • 如果對應(yīng)的key存在則value存儲對應(yīng)值,exists值為true
  • 如果對應(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不存在!")
}

程序運行結(jié)果:

2.3.4 刪除

語法格式:delete(map_name, key)

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

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

程序運行結(jié)果:

2.3.5 遍歷

語法格式:for k, v := range map_name {}

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

// 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)
}

程序運行結(jié)果:

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

相關(guān)文章

  • 深入了解Go語言中database/sql是如何設(shè)計的

    深入了解Go語言中database/sql是如何設(shè)計的

    在?Go?語言中內(nèi)置了?database/sql?包,它只對外暴露了一套統(tǒng)一的編程接口,便可以操作不同數(shù)據(jù)庫,那么database/sql?是如何設(shè)計的呢,下面就來和大家簡單聊聊吧
    2023-07-07
  • 一文教你學(xué)會Go中singleflight的使用

    一文教你學(xué)會Go中singleflight的使用

    緩存在項目中使用應(yīng)該是非常頻繁的,提到緩存只要了解過?singleflight?,基本都會用于緩存實現(xiàn)的一部分吧,下面就跟隨小編一起來學(xué)習(xí)一下singleflight的使用吧
    2024-02-02
  • Golang實現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解

    Golang實現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解

    這篇文章主要介紹了如何利用Go語言實現(xiàn)對文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • Go 中燒腦的接口及空接口

    Go 中燒腦的接口及空接口

    在Go語言的實際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結(jié)構(gòu)的核心,這篇文章主要介紹了Go 中燒腦的接口,需要的朋友可以參考下
    2024-02-02
  • 深入解析Go語言編程中的遞歸使用

    深入解析Go語言編程中的遞歸使用

    這篇文章主要介紹了Go語言編程中的遞歸使用,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Go語言中循環(huán)語句使用的示例詳解

    Go語言中循環(huán)語句使用的示例詳解

    在不少實際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語句。本文將通過示例詳細為大家講講Go語言中的循環(huán)語句,需要的可以參考一下
    2022-04-04
  • go語言區(qū)塊鏈實戰(zhàn)實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    go語言區(qū)塊鏈實戰(zhàn)實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    這篇文章主要為大家介紹了go語言區(qū)塊鏈的實戰(zhàn)學(xué)習(xí),來實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 初探Golang數(shù)據(jù)結(jié)構(gòu)之Slice的使用

    初探Golang數(shù)據(jù)結(jié)構(gòu)之Slice的使用

    在學(xué)習(xí)Go語言時,一直對數(shù)組和切片的使用場景好奇,不明白為什么推薦使用切片來代替數(shù)組,所以本文就來和大家梳理一下Slice切片的相關(guān)知識吧
    2023-09-09
  • go語言中的Stringer的使用示例詳解

    go語言中的Stringer的使用示例詳解

    Go 語言中的 Stringer 是一個非常有用的接口,它在標(biāo)準(zhǔn)庫的 fmt 包中定義,Stringer 接口允許類型定義它們的字符串表示方式,這在格式化輸出時特別有用,這篇文章主要介紹了go語言中的Stringer的使用,需要的朋友可以參考下
    2025-02-02

最新評論