golang的Map

Map集合

概述

Map 是一種無序的鍵值對的集合。

Map 最重要的一點是通過 key 來快速檢索數據,key 類似于索引,指向數據的值。

Map 是一種集合,所以我們可以像迭代數組和切片那樣迭代它。不過,Map 是無序的,遍歷 Map 時返回的鍵值對的順序是不確定的。

在獲取 Map 的值時,如果鍵不存在,返回該類型的零值,例如 int 類型的零值是 0,string 類型的零值是 “”。

Map 是引用類型,如果將一個 Map 傳遞給一個函數或賦值給另一個變量,它們都指向同一個底層數據結構,因此對 Map 的修改會影響到所有引用它的變量。

定義map

map關鍵字定義

基本語法

var 集合名 map[鍵類型]值類型;

舉例

package map_knowledgeimport "fmt"//通過關鍵字定義map
func CreateMap() {var map1  map[string]string;fmt.Printf("map1的值為%#v\n",map1)
}

結果

map1的值為map[string]string(nil)

注意

用關鍵字定義的map初始值為nil,我們不能對其直接操作。

package map_knowledgeimport "fmt"//通過關鍵字定義map
func CreateMap() {var map1  map[string]string;fmt.Printf("map1的值為%#v\n",map1)//用關鍵字定義的map為nil,不能直接操作/*報錯:panic: assignment to entry in nil map*/// map1["name"] = "zhansan"
}

小結

這種用關鍵字定義的map就是一個空集合,如果要能夠操作只有兩種等價方案。

function CreateMap(){//方案1:定義完后用make開辟空間var map1 map[string]stringmap1 = make(map[string]string)//方案2:定義的時候賦值初始化//這樣golang也會為map開辟空間var map2 = map[string]string{"name":"lisa"}
}

make定義

make既可以用于幫空集合開辟空間,也可以直接定義集合,golang官方也推薦這種形式。

基本語法

/* 使用 make 函數 */
map_variable := make(map[KeyType]ValueType, initialCapacity)

其中KeyType是鍵的類型,ValueType是值的類型,initialCapacity是可選的參數,用于指定 Map 的初始容量。

Map 的容量是指 Map 中可以保存的鍵值對的數量,當 Map 中的鍵值對數量達到容量時,Map 會自動擴容。

如果不指定 initialCapacity,Go 語言會根據實際情況選擇一個合適的值。

一般來說我們不用特別指定容量,因為即使我們指定了,如果不夠也會自己擴容。

舉例

//通過make定義map
func CreateMapByMake(){var map1 = make(map[string]string,2)fmt.Printf("map1的值為%#v\n",map1)
}

結果

map1的值為map[string]string{}

注意

由于make定義開辟了空間,所以map可以直接操作。(這也是推薦用make定義的原因。)

func CreateMapByMake(){var map1 = make(map[string]string,2)fmt.Printf("map1的值為%#v\n",map1)map1["name"]="lisa"fmt.Printf("賦值后,map1的值為%#v\n",map1)
}

結果為

map1的值為map[string]string{}
賦值后,map1的值為map[string]string{"name":"lisa"}

map初始化

字面量初始化

基本語法

var map變量 map[鍵類型]值類型 = map[鍵類型]值類型{初始值}
//可以省略左邊的類型
var map變量 = map[鍵類型]值類型{初始值}

map可以通過賦值直接初始化,例如:

var map1 = map[string]int{//最后一項也要有逗號"name":10,
}

注意事項

以字面量初始化map,內部的每一項用,隔開,且最后一項也必須要有,

make初始化

我們先查看make的源碼:

func make(t Type, size ...IntegerType) Type

所以make只能先定義map,然后靠賦值初始化。

var map1 = make(map[string]int)
map1["age"] = 19

map訪問

注意事項

我們只能操作開辟了內存空間的map,用關鍵字定義但是沒有初始化的map是空map,無法操作.(見上文)

訪問map

基本語法

map[keyValue];

訪問不存在的鍵名不會報錯,只會返回值類型的零值。

因為map[鍵類型]值類型,起初就指定了值的類型

舉例

//訪問map
func VisitMap(){var map1 = map[string]int{"age":19,}fmt.Printf("age的值為%#v\n",map1["age"])fmt.Printf("訪問不存在的項值為%#v\n",map1["other"])
}

結果

age的值為19
訪問不存在的項值為0

嚴格訪問map

我們還可以用另一種方式訪問map,來得知鍵是否存在。

基本語法

/*第一個返回值是鍵名對應的值,如果存在則返回值,否則為類型零值第二個返回值判斷鍵是否存在,如果存在則是true,反之false
*/
val,isOk := map[鍵名] 

舉例

func VisitMapIsOk(){var map1 = map[string]int{"age":19,}ageVal,isAgeOk := map1["age"]fmt.Printf("age存在為%v,age的值為%#v\n",isAgeOk,ageVal)nameVal,isNameOk := map1["name"]fmt.Printf("name存在為%v,name的值為%#v\n",isNameOk,nameVal)
}

結果

age存在為true,age的值為19
name存在為false,name的值為0

任意類型的值

我們可以用interface{}空接口類型來接收任意類型的值。

func InterfaceMap(){//interface{}是值類型var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("鍵%v對應的值為%v\n",key,val)}
}

結果

鍵name對應的值為lisa
鍵age對應的值為19
注意事項1:零值

interface{}是一個字面量類型,被稱為空接口類型,零值為<nil>

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("鍵%v對應的值為%v\n",key,val)}//注意事項1:interface{}是一個類型,零值為nilfmt.Printf("不存在的鍵的值為%v\n",map1["other"])
}

結果

鍵name對應的值為lisa
鍵age對應的值為19
不存在的鍵的值為<nil>
注意實現2:類型斷言

interface{}類型的值在實際使用時需要類型斷言,

斷言語法

講接口時會詳述

var n interface{}
n = "world"
//val是值,ok代表是否成功
val,ok := n.(string)

如果斷言出錯也會報錯,例如

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("鍵%v對應的值為%v\n",key,val)}//注意事項1:interface{}是一個類型,零值為nilfmt.Printf("不存在的鍵的值為%v\n",map1["other"])//注意事項2:interface{}類型的值在實際使用時要進行類型斷言if(map1["age"].(int64)>=18){fmt.Printf("你已經是個成年人了")}
}

報錯

panic: interface conversion: interface {} is int, not int64

正確案例

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("鍵%v對應的值為%v\n",key,val)}//注意事項1:interface{}是一個類型,零值為nilfmt.Printf("不存在的鍵的值為%v\n",map1["other"])//注意事項2:interface{}類型的值在實際使用時要進行類型斷言/*可以先通過打印來判斷具體類型,或者用switch方法*/fmt.Printf("鍵age的值類型為%T\n",map1["age"])if(map1["age"].(int)>=18){fmt.Printf("你已經是個成年人了")}
}

結果

鍵name對應的值為lisa
鍵age對應的值為19
不存在的鍵的值為<nil>
鍵age的值類型為int
你已經是個成年人了

map增改

基本語法

map[] =

如果鍵存在就是修改,否則就是新增。

map的長度

基本語法

len(map)

注意:不能用cap(map)求容量,因為map的容量用處不大,只是初始開辟空間時給個提示,未來可以輕松擴容。

舉例

func GetMapLen(){var map1 = map[string]int{"age":19,}fmt.Printf("map1的長度為%d\n",len(map1))
}

結果

map1的長度為1

delete刪除元素

基本語法

//要注意鍵的類型,golang是強類型語言
delete(map變量,鍵名)

舉例

func DelMapItem(){var map1 = map[int64]string{1:"hello",2:"world",}fmt.Printf("刪除前map1的值為%#v\n",map1)//刪除delete(map1,1)fmt.Printf("刪除后map1的值為%#v\n",map1)
}

結果

刪除前map1的值為map[int64]string{1:"hello", 2:"world"}
刪除后map1的值為map[int64]string{2:"world"}

注意事項

1.刪除不存在的鍵不會報錯。例如

func DelMapItem(){var map1 = map[int64]string{1:"hello",2:"world",}fmt.Printf("刪除前map1的值為%#v\n",map1)//刪除delete(map1,1)fmt.Printf("刪除后map1的值為%#v\n",map1)//刪除不存在的鍵,不會報錯delete(map1,3)
}

2.被刪除元素的影響

如果是map存在的元素:
1.map長度發生變化
2.map遍歷時訪問不到

但是我們仍然可以通過map[鍵名]訪問到,返回值類型的零值,和之前一樣。

但是用嚴格訪問會提示為false.

map遍歷

我們可以用for...range遍歷map。

基本語法

for,:= range map{}

舉例

//遍歷map
func RnageMap(){var map1 = map[int64]string{1:"hello",2:"world",}for key, val := range map1 {fmt.Printf("鍵%v對應的值為%v\n",key,val)}
}

結果

鍵1對應的值為hello
鍵2對應的值為world

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72244.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

USB數據采集卡 Labview采集卡 32路AD模擬量采集 DAQ卡

今天給大家介紹阿爾泰科技的一款多功能數據采集卡USB3150/1/2/5/6 。 該板卡提供 32RSE / NRSE 通道或 16 通道 DIFF 模 擬量輸入&#xff1b;4 通道模擬量同步輸出&#xff1b;16 路可編程 I/O&#xff1b;2 路計數器。 USB3150/1/2/5/6 的主要應用場合為&#xff1a;電子產品…

K8s 1.27.1 實戰系列(十)PV PVC

一、核心概念與關系 ?1、PV(Persistent Volume)? PV 是集群中的持久化存儲資源,由管理員預先創建并配置,獨立于 Pod 生命周期。它抽象了底層存儲(如 NFS、云存儲等),定義存儲容量、訪問模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等屬性。例如,一…

基于DeepSeek的智能數據分析和自動化處理系統:引領BI行業新變革

近期&#xff0c;一款基于DeepSeek API的智能數據分析和自動化處理系統橫空出世&#xff0c;以其強大的功能和靈活的可擴展性&#xff0c;為BI行業帶來了顛覆性的變革。 該系統支持多類型數據分析&#xff0c;包括文本 、指標和日志等。在文本分析方面&#xff0c;它能夠提取關…

圖形學面試題總結

圖形學面試題總結 文章目錄 圖形學面試題總結Opengl 與 Vulkan1、OpenGL的渲染管線有哪些主要階段&#xff1f;分別做什么&#xff1f;2、OpenGL中的VAO、VBO和EBO分別是什么&#xff1f;為什么需要它們&#xff1f;3、細分著色器與幾何著色器是什么4、Vulkan與Opengl的區別是什…

Vue 系列之:路由

vue-router 組件 router-link 功能&#xff1a;用于導航&#xff0c;即渲染一個鏈接&#xff0c;當點擊時&#xff0c;導航到由 to 屬性指定的 URL。 示例&#xff1a;<router-link to"/home">Home</router-link> 它會渲染為一個 <a> 標簽&…

通過mybatis的攔截器對SQL進行打標

1、背景 在我們開發的過程中&#xff0c;一般需要編寫各種SQL語句&#xff0c;萬一生產環境出現了慢查詢&#xff0c;那么我們如何快速定位到底是程序中的那個SQL出現的問題呢&#xff1f; 2、解決方案 如果我們的數據訪問層使用的是mybatis的話&#xff0c;那么我們可以通過…

【Linux】centos配置可用的yum源

在 CentOS 系統中配置可用的 YUM 源&#xff08;倉庫&#xff09;是保持系統更新和軟件包管理的重要步驟。下面是一些步驟和示例&#xff0c;幫助你配置可用的 YUM 源&#xff1a; 1. 備份當前 YUM 倉庫配置 首先&#xff0c;備份你當前的 YUM 倉庫配置文件&#xff0c;以防萬…

【CentOS】搭建Radius服務器

目錄 背景簡介&#xff1a;Radius是什么&#xff1f;Radius服務器驗證原理搭建Radius服務器環境信息yum在線安裝配置FreeRADIUS相關文件clients.conf文件users文件重啟服務 驗證 參考鏈接 背景 在項目中需要用到Radius服務器作為數據庫代理用戶的外部驗證服務器&#xff0c;做…

機器學習_特征工程

一、核心知識點&#xff1a;特征工程的核心概念與流程 1. 特征工程的定義與重要性 定義&#xff1a;通過數據預處理、特征構造、特征選擇等方法&#xff0c;將原始數據轉化為更適合機器學習模型輸入的特征&#xff0c;提升模型性能。重要性&#xff1a; “數據和特征決定了機…

Elasticsearch Java High Level Client [7.17] 使用

es 的 HighLevelClient存在es源代碼的引用&#xff0c;結合springboot使用時&#xff0c;會存在es版本的沖突&#xff0c;這里記錄下解決沖突和使用方式&#xff08;es已經不建議使用這個了&#xff09;。 注意es服務端的版本需要與client的版本對齊&#xff0c;否則返回數據可…

rtsp在網頁上顯示(webrtc-stream)

一&#xff1a;windos 平臺 1&#xff1a;下載已經編譯好的windos平臺程序 Releases mpromonet/webrtc-streamer (github.com) or 【免費】webrtc-streamerv0.8.6一款werbrtc服務器&#xff08;windos版本&#xff09;&#xff0c;可以直接將rtsp流拉到網頁上顯示資源-CSDN文…

【AI大模型智能應用】Deepseek生成測試用例

在軟件開發過程中&#xff0c;測試用例的設計和編寫是確保軟件質量的關鍵。 然而&#xff0c;軟件系統的復雜性不斷增加&#xff0c;手動編寫測試用例的工作量變得異常龐大&#xff0c;且容易出錯。 DeepSeek基于人工智能和機器學習&#xff0c;它能夠依據軟件的需求和設計文…

如何在vscode中編譯linux中的c++文件

方式一 在終端打開進行連接編譯 指令含義&#xff1a;將 muduo_server.cpp 源文件編譯成一個可執行文件 server&#xff0c;并且在鏈接過程中使用 muduo_net、muduo_base 庫以及 pthread 庫 方式二 在vscode中修改配置文件 按F1打開配置文件搜索欄&#xff0c;輸入C/C 打開…

基于Flink SQL的實時指標多維分析模型

數據流程介紹 1.創建源表kafka接入消息隊列數據&#xff0c;定義字段映射規則&#xff1b; 2.創建目標表es_sink配置Elasticsearch輸出&#xff1b; 3.通過多級視圖&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;實現數據清洗、去重、狀態計算&#x…

【vscode-01】vscode不同項目不同語言擴展插件隔離方案

vscode不同項目不同語言擴展插件隔離方案 1. 背景2. vscode 擴展插件隔離方案2.1 code-profile 配置文件2.2 配合extensions.json 1. 背景 最近打開vscode 發現越來越卡&#xff0c;這是一個輕量級代碼編輯器&#xff0c;怎么會如此占用內存呢&#xff1f; 我使用了‘code --l…

《基于大數據的營養果蔬推薦系統的設計與實現》開題報告

目錄 一、選題的理論意義現實意義及應用價值 &#xff08;一&#xff09;理論意義 &#xff08;二&#xff09;現實意義 1.用戶價值提升 2.效率提升 3.經濟效益提升 &#xff08;三&#xff09;應用價值 1.提升用戶健康水平 2.優化購物體驗 3.支持健康決策 4.促進農業…

《C#上位機開發從門外到門內》2-4:Modbus協議

文章目錄 一、引言二、Modbus協議概述2.1 Modbus協議的起源與發展2.2 Modbus協議的基本特點2.3 應用領域 三、Modbus通信原理詳解3.1 Modbus RTU原理3.1.1 數據幀結構3.1.2 數據傳輸與時序3.1.3 錯誤檢測 3.2 Modbus TCP原理3.2.1 數據封裝3.2.2 通信機制3.2.3 與RTU模式的區別…

觀成科技:?加密C2框架Platypus流量分析

一、工具介紹 Platypus 是一款支持多會話的交互式反向 Shell 管理器。在實際的滲透測試中&#xff0c;為了解決 Netcat/Socat 等工具在文件傳輸、多會話管理方面的不足,該工具在多會話管理的基礎上增加了在滲透測試中能更好發揮作用的功能&#xff08;如&#xff1a;交互式 Sh…

OpenBMC:BmcWeb 處理http請求

OpenBMC:BmcWeb 讀取http請求頭-CSDN博客 介紹了,在讀取完http頭后,將調用Connection::handle處理http請求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …

MySQL事務深度解析:ACID特性、隔離級別與MVCC機制

引言 在數據庫系統中&#xff0c;?事務是保障數據一致性與完整性的核心機制。MySQL通過ACID特性、多級隔離策略和MVCC&#xff08;多版本并發控制&#xff09;實現了高性能與高可靠性的平衡。本文將從底層原理出發&#xff0c;系統解析事務的四大特性、隔離級別的實現邏輯&am…