go語言之map

?1.map認識? ? ? ?

????????哈希表是一種巧妙并且實用的數據結構。它是一個無序的key/value對的集合,其中所有的key都是不同的,然后通過給定的key可以在常數時間復雜度內檢索、更新或者刪除對用的value。

? ? ? ? 在Go語言中,一個map就是一個哈希表的引用,map類型可以寫為map[K]V,其中K和V分別對應的key和value。map中所有的key都是相同的類型,所有的value也是相同的類型,但是key和value之間可以是不同的數據類型。其中K對應的key必須是支持==比較運算符的數據類型,所以map可以通過測試key是否相等來判斷是否已經存在。

?2.map的創建? ? ? ?

????????內置的make函數可以創建一個map:

ages := make(map[string]int) // mapping from strings to ints

????????我們也可以用map字面值的語法創建map,同時還可以指定一些最初的key/value:

package mainimport "fmt"func main() {ages := map[string]int{"alice":   31,"charlie": 34,}fmt.Println(ages)
}map[alice:31 charlie:34]

? ? ? ? 也可以用下列來創建map:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34fmt.Println(ages)
}map[alice:31 charlie:34]

????????因此,另一種創建空的map的表達式是 map[string]int{} 。

3.map的引用

????????Map中的元素通過key對應的下標語法訪問:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34fmt.Println(ages["alice"])
}31

? ? ? ? 我們也可以用內置的delete函數可以刪除元素:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34delete(ages, "alice")fmt.Println(ages["alice"])fmt.Println(ages)
}0
map[charlie:34]

????????所有這些操作是安全的,即使這些元素不在map中也沒有關系;如果一個查找失敗將返回 value類型對應的零值,例如,即使map中不存在“bob”下面的代碼也可以正常工作,因為 ages["bob"]失敗時將返回0。

????????

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34ages["bob"] = ages["bob"] + 1fmt.Println(ages)
}map[alice:31 bob:1 charlie:34]

????????而且 x += y 和 x++ 等簡短賦值語法也可以用在map上,所以上面的代碼可以改寫成

ages["bob"] += 1

????????更簡單的寫法

ages["bob"]++

????????但是map中的元素并不是一個變量,因此我們不能對map的元素進行取址操作:

_ = &ages["bob"] // compile error: cannot take address of map element

? ? ? ??禁止對map元素取址的原因是map可能隨著元素數量的增長而重新分配更大的內存空間,從而 可能導致之前的地址無效。要想遍歷map中全部的key/value對的話,可以使用range風格的for循環實現,和之前的slice遍歷語法類似。下面的迭代語句將在每次迭代時設置name和age變量,它們對應下一個鍵/值對:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34ages["bob"] = ages["bob"] + 1fmt.Println(ages)for name, age := range ages {fmt.Printf("%s\t%d\n", name, age)}
}map[alice:31 bob:1 charlie:34]
charlie	34
bob	1
alice	31

? ? ? ? Map的迭代順序是不確定的,并且不同的哈希函數實現可能導致不同的遍歷順序。在實踐中,遍歷的順序是隨機的,每一次遍歷的順序都不相同。這是故意的,每次都使用隨機的遍歷順序可以強制要求程序不會依賴具體的哈希函數實現。如果要按順序遍歷key/value對,我 們必須顯式地對key進行排序,可以使用sort包的Strings函數對字符串slice進行排序。下面是 常見的處理方式:

package mainimport ("fmt""sort"
)func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34var names []stringfor name := range ages {names = append(names, name)}sort.Strings(names)for _, name := range names {fmt.Printf("%s\t%d\n", name, ages[name])}}alice	31
charlie	34

????????因為我們一開始就知道names的最終大小,因此給slice分配一個合適的大小將會更有效。下 面的代碼創建了一個空的slice,但是slice的容量剛好可以放下map中全部的key:

names := make([]string, 0, len(ages))

????????在上面的第一個range循環中,我們只關心map中的key,所以我們忽略了第二個循環變量。 在第二個循環中,我們只關心names中的名字,所以我們使用“_”空白標識符來忽略第一個循 環變量,也就是迭代slice時的索引。 map類型的零值是nil,也就是沒有引用任何哈希表。

????????在向map存數據前必須先創建map。 通過key作為索引下標來訪問map將產生一個value。如果key在map中是存在的,那么將得到 與key對應的value;如果key不存在,那么將得到value對應類型的零值,正如我們前面看到的 ages["bob"]那樣。這個規則很實用,但是有時候可能需要知道對應的元素是否真的是在map 之中。例如,如果元素類型是一個數字,你可以需要區分一個已經存在的0,和不存在而返回 零值的0,可以像下面這樣測試:

age, ok := ages["bob"]
if !ok { /* "bob" is not a key in this map; age == 0. */ }
或者
if age, ok := ages["bob"]; !ok { /* ... */ }

????????在這種場景下,map的下標語法將產生兩個值;第二個是一個布爾值,用于報告元素是否真 的存在。布爾變量一般命名為ok,特別適合馬上用于if條件判斷部分。 和slice一樣,map之間也不能進行相等比較;唯一的例外是和nil進行比較。要判斷兩個map是 否包含相同的key和value,我們必須通過一個循環實現:

func equal(x, y map[string]int) bool {if len(x) != len(y) {return false}for k, xv := range x {if yv, ok := y[k]; !ok || yv != xv {return false}}return true
}

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

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

相關文章

XSKY CTO 在英特爾存儲技術峰會的演講:LLM 存儲,架構至關重要

5 月 17 日,英特爾存儲技術峰會在北京順利舉辦。作為英特爾長期的合作伙伴,星辰天合受邀參加了此次峰會。星辰天合 CTO 王豪邁作為特邀嘉賓之一,作了主題為《LLM 存儲:架構至關重要》的演講,分享了大語言模型&#xff…

2024年中國金融行業網絡安全案例集

隨著科技的飛速發展,金融行業與信息技術的融合日益加深,網絡安全已成為金融行業發展的生命線。金融行業作為國家經濟的核心支柱,正在面臨著日益復雜嚴峻的網絡安全挑戰。因此,深入研究和探討金融行業的網絡安全問題,不僅關乎金融行業的穩健運…

Jtti:如何在Linux服務器上查看系統日志?

在美國的Linux服務器上查看系統日志是系統管理員常見的任務之一。系統日志可以幫助你診斷和解決服務器上的問題。以下是如何在Linux服務器上查看系統日志的詳細教程: 1. 連接到服務器 首先,通過SSH連接到你的Linux服務器。如果你在本地終端使用SSH&#…

MIPI豎屏解決方案,普立晶POL8901升級POL8903 兩PORT LVDS橋接到MIPI,加旋轉

POL8903描述: 系統: ?采用高性能MIPS 32位CPU內核; ?高性能DSP內核圖像處理單元; ?16 KB指令Cache;16 KB數據Cache; ?96 KB SRAM;內置DDR 3控制器; LVDS輸入: …

Python代碼:十七、生成列表

1、題目 描述: 一串連續的數據用什么記錄最合適,牛牛認為在Python中非列表(list)莫屬了。現輸入牛牛朋友們的名字,請使用list函數與split函數將它們封裝成列表,再整個輸出列表。 輸入描述: …

取代或轉型?人工智能對軟件測試的影響(內附工具推薦)

在當今快速發展的數字環境中,從移動App到基于Web的平臺,軟件已成為我們日常生活和工作不可或缺的一部分。然而,隨著軟件系統變得越來越復雜,如何確保其質量和可靠性已成為開發人員和測試人員所面臨的一大重要挑戰。 這就是軟件測…

從0開始學統計

1.什么是統計學?統計學主要研究哪些問題? 統計學是一門科學,主要研究數據的收集、分析、解釋和呈現方法。它涉及收集數據的方法,如調查和實驗設計,以及通過數學和計算方法來分析和解釋數據的過程。統計學的主要目標是…

(九)Python3 接口自動化測試,Jenkins調度執行

(九)Python3 接口自動化測試,Jenkins調度執行 Jenkins配置在遠程服務器上執行Shell來運行Python(通過SSH免密方式執行) 說明:Jenkins部署在ServerA:10.1.1.74上,要運行的程序在ServerB:10.1.1.196 分兩步 第一步:Linux Centos7配置SSH免密登錄 Linux Centos7配置SSH…

長沙客戶忠誠度調查

本文由群狼調研(長沙員工滿意度調查)出品,歡迎轉載,請注明出處。員工滿意度調查是衡量員工對公司或組織的工作環境、待遇、領導力和管理的滿意程度的一種方法。這項調查對于組織和公司非常重要,因為它可以提供有關員工…

Autoware 軟件功能(二)

Tip: 如果你在進行深度學習、自動駕駛、模型推理、微調或AI繪畫出圖等任務,并且需要GPU資源,可以考慮使用Compshare的GPU算力云平臺。他們提供高性價比的4090 GPU,按時收費每卡2.6元,月卡只需要1.7元每小時,并附帶200G…

【好物推薦】給大家安利一個靜態網站生成器框架搜集

你一定好奇很多文檔網站是用什么框架寫的,或者你聽說過 vue press,Git Book,其實這類優秀的網站很多,有個網站統計了所有框架的熱度,大家有興趣的可以去看看。 傳送門:https://jamstack.org/generators/ 比…

UE5 使用外置攝像頭進行拍照并保存到本地

連接外置攝像頭功能:https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/MediaFramework/HowTo/UsingWebCams/ 核心功能:UE4 相機拍照功能(圖片保存)_ue 移動端保存圖片-CSDN博客 思路是: …

萬博智云×華為云 | HyperBDR云容災上架,開啟聯營聯運新篇章

日前,萬博智云HyperBDR云容災正式入駐華為云云商店,成為華為云基礎軟件領域聯營聯運合作伙伴。通過聯營聯運,雙方將進一步加深在產品、解決方案、渠道拓展等多方面的強強聯合,為企業提供更加安全、高效的數據保護解決方案&#xf…

vue-table的使用,解決懶加載展開列,數據量過大,造成的卡頓問題

場景 有需求,使用懶加載的展開列,當加載的數據量過大,如大于1000條以上,瀏覽器可能卡死掛了 分析 大量的dom的渲染繪制,導致了瀏覽器處理不過來 解決 虛擬列表 vue-table 虛擬列表的使用 vue-table官網 <vxe-table border resizable height="100%" r…

重量and體積,不要在傻傻的花冤枉錢寄快遞了!

寄快遞時有沒有遇到過明明不重卻被按體積收費的情況&#xff1f;別急&#xff0c;今天就來給大家揭秘快遞收費的奧秘&#xff01; 實際重量和體積重量&#xff01; 首先&#xff0c;我們要明白兩個概念&#xff1a;實際重量和體積重量。實際重量就是你看到的物品重量&#xf…

JVM為什么要進行分代呢?

Java 虛擬機&#xff08;JVM&#xff09;的內存管理是 Java 性能優化的核心部分&#xff0c;而分代思想&#xff08;Generational Garbage Collection&#xff09;是其關鍵機制之一。理解 JVM 的分代思想對于優化 Java 應用的性能、減少垃圾收集的停頓時間至關重要。本文將詳細…

angr使用學習(持續更新)

首先我是直接在kali中安裝的&#xff0c;也是邊練邊學的。 嗯&#xff0c;要在純凈python環境&#xff0c;所以是在 virtualenv 虛擬環境里&#xff0c;也不是特別會用這個&#xff0c;按照教程一步步做的 source venv/bin/activate 進入了對應環境 退出是 deactivate en,ipy…

DataGrip軟件執行已將創建好的sql文件步驟

一、在需要導入sql文件上右擊找到SQLScript &#xff0c;然后點擊 Run SQL Script 二、找到sql文件&#xff0c;點擊OK就可以了

Day01-01-git

Day01-01-git Content List0. 運維發展過程1. ci-cd-co基礎1.1 軟件的生命周期1&#xff09;軟件的聲明周期&#xff1a;軟件從0-->1-->0過程2&#xff09;ci/cd3&#xff09;Devops4) 小結 1.2 什么是環境1.3 什么是代碼部署1.4 代碼發布方式 3. DevSecOpt之Git極速入門…