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

Golang中map數(shù)據(jù)類型的使用方法

 更新時(shí)間:2022年09月05日 14:59:39   作者:7small7  
這篇文章主要介紹了Golang中map數(shù)據(jù)類型的使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下

前言

今天咱們來(lái)學(xué)習(xí)一下golang中的map數(shù)據(jù)類型,單純的總結(jié)一下基本語(yǔ)法和使用場(chǎng)景,也不具體深入底層。map類型是什么呢?做過PHP的,對(duì)于數(shù)組這種數(shù)據(jù)類型是一點(diǎn)也不陌生了。PHP中的數(shù)組分為索引數(shù)組關(guān)聯(lián)數(shù)組。例如下面的代碼:

// 索引數(shù)組【數(shù)組的key是一個(gè)數(shù)字, 從0,1,2開始遞增】
$array = [1, '張三', 12];
// 關(guān)聯(lián)數(shù)組【數(shù)組的key是一個(gè)字符串,可以自定義key的名稱】
$array = ['id' => 1, 'name' => '張三', 'age' => 12];

在golang中,map是一種特殊的數(shù)據(jù)結(jié)構(gòu),是一種key對(duì)應(yīng)一個(gè)value類型的結(jié)構(gòu)。這種結(jié)構(gòu)可以被稱為關(guān)聯(lián)數(shù)組和字典。

在golang中也有切片和數(shù)組這樣的數(shù)據(jù)類型,來(lái)存儲(chǔ)一組數(shù)據(jù)。

  • 數(shù)組就好比PHP中的一維數(shù)組,并且長(zhǎng)度是固定的,其中的值類型在定義數(shù)組的時(shí)候就確定好了。
  • 切片是一種特殊的數(shù)組類型。長(zhǎng)度是固定的。
// 數(shù)組,類型是int,長(zhǎng)度是4。
array := [4]int{1, 2, 3, 4}
// 切片,類型是int,長(zhǎng)度不固定。
slice := []int{1, 2, 3, 4}

有數(shù)組和切片可以存儲(chǔ)一組數(shù)據(jù),那為什么還有map這樣的類型結(jié)構(gòu)呢?map類型具體是啥樣的呢?

案例

假設(shè)我們現(xiàn)在有這樣的一個(gè)需求,要用golang中的一種數(shù)據(jù)類型來(lái)存儲(chǔ)多個(gè)用戶的數(shù)據(jù),這些數(shù)據(jù)分別用戶的ID,name,age,sex…等等字段。我們改用什么數(shù)據(jù)類型呢?

在PHP中我們可以直接下面的方式定義,操作也是非常簡(jiǎn)單。

$userInfo = [
  ['id' => 1, 'name' => '張三', 'age' => 12, 'sex' => '男'],  
  ['id' => 2, 'name' => '趙六', 'age' => 22, 'sex' => '男'],
  ['id' => 3, 'name' => '李四', 'age' => 34, 'sex' => '女'],
  ['id' => 4, 'name' => '王麻子', 'age' => 56, 'sex' => '男']
];

那如何在golang中實(shí)現(xiàn)呢,假設(shè)我們用數(shù)組和切片實(shí)現(xiàn)一下試試。

// 1. 用數(shù)組實(shí)現(xiàn)
$user1 := [4]string{"1", "張三", "12", "男"}
$user2 := [4]string{"2", "趙六", "12", "男"}
$user3 := [4]string{"3", "李四", "12", "女"}
$user4 := [4]string{"4", "王麻子", "12", "男"}
// 2. 用戶切片實(shí)現(xiàn)
$user1 := []string{"1", "張三", "12", "男"}
$user2 := []string{"2", "趙六", "12", "男"}
$user3 := []string{"3", "李四", "12", "女"}
$user4 := []string{"4", "王麻子", "12", "男"}

通過上面的示例代碼,我們是不是看得出來(lái)存在這樣幾個(gè)問題:

  • a. 可讀性低。我們完全不知道1、12這樣的值是用戶的什么信息,男、張三我們還可以猜測(cè)一下是名字和性別。
  • b. 重復(fù)代碼。一個(gè)用戶一個(gè)變量,如果存在千萬(wàn)個(gè)用戶,我們豈不是需要定義千萬(wàn)個(gè)變量。
  • c. 繁瑣。相比PHP的實(shí)現(xiàn),是不是非常繁瑣。PHP中直接定義一個(gè)變量,通過多維數(shù)組的方式,就可以定義key和值。清晰并且簡(jiǎn)單。這也是為什么大家都說(shuō)PHP中的數(shù)組非常強(qiáng)大和好用了。

通過切片和數(shù)組實(shí)現(xiàn)的方式,我們知道了弊端。那有不有一種數(shù)據(jù)類型能夠像PHP這樣簡(jiǎn)單就能實(shí)現(xiàn)呢?這樣的場(chǎng)景就可以用map實(shí)現(xiàn)PHP這樣的定義結(jié)構(gòu)。接下來(lái),我們就具體總結(jié)一下map相關(guān)的操作。

map

map定義

map 是一種特殊的數(shù)據(jù)結(jié)構(gòu):一種元素對(duì)(pair)的無(wú)序集合,pair 的一個(gè)元素是 key,對(duì)應(yīng)的另一個(gè)元素是 value,所以這個(gè)結(jié)構(gòu)也稱為關(guān)聯(lián)數(shù)組或字典。這是一種快速尋找值的理想結(jié)構(gòu):給定 key,對(duì)應(yīng)的 value 可以迅速定位。
map 這種數(shù)據(jù)結(jié)構(gòu)在其他編程語(yǔ)言中也稱為字典(Python)、hash 和 HashTable 等。

map聲明

map屬于一種引用類型,在使用時(shí)我們需要make給其分配內(nèi)存空間,未分配內(nèi)存空間的map值是一個(gè)nil。

map聲明時(shí),需要指定key的類型和值的類型,并且復(fù)制時(shí),必須按照定義時(shí)的類型進(jìn)行復(fù)制。
map的值可以是任意類型,可以是切片可以是數(shù)組,可以是接口、結(jié)構(gòu)體、指針、字符串等等數(shù)據(jù)類型。
var map1 map[key類型]值類型

// 聲明方式一,完整模式
var map1 map[int]string
map1 = make(map[int]string[, n])

// 聲明方式二,段語(yǔ)法風(fēng)格
map1 := make(map[int]string[, n])

上面的n都是map的容量,也就是說(shuō)map可以存儲(chǔ)元素的數(shù)量??梢允÷?,map會(huì)動(dòng)態(tài)擴(kuò)容。
示例小案例,我們用map存儲(chǔ)一個(gè)用戶的信息。用戶信息包含ID,name,age字段。

userInfo := make(map[string]string)
userInfo["id"] = "1"
userInfo["name"] = "張三"
userInfo["age"] = "12"
fmt.Println(userInfo)

// output
map[id:1 name:張三 age:12]

因?yàn)橛脩粜畔⒌淖侄魏妥侄沃涤凶址蛿?shù)字類型,定義好類型之后就只能傳對(duì)應(yīng)類型的值,因此我們給key和value的類型都定義為string類型。

map的操作

這里的操作,我們接著上面的小案例來(lái)使用。

  • 訪問和復(fù)制。我們直接使用下標(biāo)就可以了。
// 賦值
mapName[key] = "值"
userInfo["name"] = "王五"

// 訪問
mapName[key]
name := userInfo["name"]
  • 刪除元素。刪除操作,需要使用到delete(),給該函數(shù)傳遞要?jiǎng)h除的key。
delete(mapName, key)

delete(userInfo, "name")
  • 判斷某一個(gè)值key是否存在。上面我們?cè)L問map中的key,直接使用下標(biāo)就可以了。如果 map 中不存在 key1,val1 就是一個(gè)值類型的空值。會(huì)導(dǎo)致我們沒法區(qū)分到底是 key不存在還是它對(duì)應(yīng)的value就是空值。
value, boolean := mapName[key]
// 如果boolean是一個(gè)true則說(shuō)明,對(duì)應(yīng)的key存在,如果是false,則說(shuō)明該key不存在。

if value, ok := userInfo["address"]; !ok {
  fmt.Println("address key not found!")
}
//因?yàn)閍ddress這個(gè)key不存在,因此會(huì)輸出“address key not found!”。
  • 循環(huán)。循環(huán)map,我們一般是用到 for range來(lái)實(shí)現(xiàn)。
// 語(yǔ)法
for value, key := range mapName {
  fmt.Println(key, "=>", value)
}
// 示例
for value, key := range userInfo {
    fmt.Println(key, "=>", value)
}
// output
1 => id
張三 => name
12 => age

總結(jié)

其實(shí)對(duì)map基本的操作就是這么簡(jiǎn)單。對(duì)它的理解也是這么簡(jiǎn)單。在日常開發(fā)中,我們也經(jīng)常使用該類型。

回到最上面多個(gè)用戶的案例,這時(shí)候我們是不是就知道怎么使用map實(shí)現(xiàn)了。

  • 因?yàn)槭嵌鄠€(gè)用戶,我們是不是需要定義多維的map結(jié)構(gòu)。
  • map的一級(jí)key是int,表示當(dāng)前的用戶序號(hào)(從0,1,2,3…依次遞增)。key對(duì)應(yīng)的值,才是某一個(gè)用戶的具體信息,我們同樣的定義map類型來(lái)存儲(chǔ),key和value都是字符串,結(jié)構(gòu)就像map聲明中的小案例一樣。
  • 因?yàn)槲覀儾恢烙脩舻木唧w個(gè)數(shù),我們將一級(jí)的key定義為切片。因?yàn)榍衅拈L(zhǎng)度是不固定的。
userInfo := make([]map[string]string, 3)

for i := 0; i < 3; i++ {
    userInfo[i] = make(map[string]string, 3)
     userInfo[i]["id"] = "ID"
     userInfo[i]["name"] = "名稱"
     userInfo[i]["age"] = "年齡"
}
fmt.Println(userInfo)

// output
[
  map[id:ID name:名稱 age:年齡] 
  map[id:ID name:名稱 age:年齡] 
  map[id:ID name:名稱 age:年齡]
]

為什么要兩次make,因?yàn)榍衅蚼ap在golang中都是引用類型。第一次在make時(shí),是針對(duì)切片初始化內(nèi)存空間,第二次是針對(duì)切片的key對(duì)應(yīng)的元素分配內(nèi)存空間。大致的結(jié)構(gòu)就像下圖一樣。

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

相關(guān)文章

  • Go語(yǔ)言colly框架的快速入門

    Go語(yǔ)言colly框架的快速入門

    Python?中非常知名的爬蟲框架有Scrapy,Go?中也有一些?star?數(shù)較高的爬蟲框架,colly就是其中的佼佼者,它?API?簡(jiǎn)潔,性能優(yōu)良,開箱即用,今天就來(lái)快速學(xué)習(xí)一下吧
    2023-07-07
  • Go返回int64類型字段超出javascript Number范圍的解決方法

    Go返回int64類型字段超出javascript Number范圍的解決方法

    這篇文章主要介紹了Go返回int64類型字段超出javascript Number范圍的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Golang實(shí)現(xiàn)http重定向https的方式

    詳解Golang實(shí)現(xiàn)http重定向https的方式

    這篇文章主要介紹了詳解Golang實(shí)現(xiàn)http重定向https的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-08-08
  • 7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景

    7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于如何通過7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用Go具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-11-11
  • Golang httptest包測(cè)試使用教程

    Golang httptest包測(cè)試使用教程

    這篇文章主要介紹了Golang httptest包測(cè)試使用,httptest包的理念是,非常容易模擬http服務(wù),也就是說(shuō)模擬響應(yīng)寫(response writer),提供給http處理器(handle),讓我們測(cè)試http服務(wù)端和客戶端很容易
    2023-03-03
  • GoFrame框架Scan類型轉(zhuǎn)換實(shí)例

    GoFrame框架Scan類型轉(zhuǎn)換實(shí)例

    這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用

    go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用

    這篇文章主要為大家介紹了go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • go語(yǔ)言實(shí)現(xiàn)全排列的示例代碼

    go語(yǔ)言實(shí)現(xiàn)全排列的示例代碼

    本文主要介紹了go語(yǔ)言實(shí)現(xiàn)全排列的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang中json小談之字符串轉(zhuǎn)浮點(diǎn)數(shù)的操作

    golang中json小談之字符串轉(zhuǎn)浮點(diǎn)數(shù)的操作

    這篇文章主要介紹了golang中json小談之字符串轉(zhuǎn)浮點(diǎn)數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-03-03
  • Golang實(shí)現(xiàn)Dijkstra算法過程詳解

    Golang實(shí)現(xiàn)Dijkstra算法過程詳解

    Dijkstra 算法是一種用于計(jì)算無(wú)向圖的最短路徑的算法,它是基于貪心策略的,每次選擇當(dāng)前距離起始節(jié)點(diǎn)最近的未訪問節(jié)點(diǎn)進(jìn)行訪問,并更新其相鄰節(jié)點(diǎn)的距離值,以得到最短路徑,這篇文章主要介紹了Golang實(shí)現(xiàn)Dijkstra算法,需要的朋友可以參考下
    2023-05-05

最新評(píng)論