国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Golang】Golang進階系列教程--Go 語言 map 如何順序讀?。?/h1>

這篇具有很好參考價值的文章主要介紹了【Golang】Golang進階系列教程--Go 語言 map 如何順序讀?。?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

Go 語言中的 map 是一種非常強大的數(shù)據(jù)結(jié)構(gòu),它允許我們快速地存儲和檢索鍵值對。
然而,當我們遍歷 map 時,會有一個有趣的現(xiàn)象,那就是輸出的鍵值對順序是不確定的。

現(xiàn)象

先看一段代碼示例:

package main

import "fmt"

func main() {
    m := map[string]int{
        "apple":  1,
        "banana": 2,
        "orange": 3,
    }

    for k, v := range m {
        fmt.Printf("key=%s, value=%d\n", k, v)
    }
}

當我們多執(zhí)行幾次這段代碼時,就會發(fā)現(xiàn),輸出的順序是不同的。

原因

首先,Go 語言 map 的底層實現(xiàn)是哈希表,在進行插入時,會對 key 進行 hash 運算。這也就導致了數(shù)據(jù)不是按順序存儲的,和遍歷的順序也就會不一致。

第二,map 在擴容后,會發(fā)生 key 的搬遷,原來落在同一個 bucket 中的 key,搬遷后,有些 key 可能就到其他 bucket 了。

而遍歷的過程,就是按順序遍歷 bucket,同時按順序遍歷 bucket 中的 key。

搬遷后,key 的位置發(fā)生了重大的變化,有些 key 被搬走了,有些 key 則原地不動。這樣,遍歷 map 的結(jié)果就不可能按原來的順序了。

最后,也是最有意思的一點。

那如果說我已經(jīng)初始化好了一個 map,并且不對這個 map 做任何操作,也就是不會發(fā)生擴容,那遍歷順序是固定的嗎?

答:也不是。

Go 杜絕了這種做法,主要是擔心程序員會在開發(fā)過程中依賴穩(wěn)定的遍歷順序,因為這是不對的。

所以在遍歷 map 時,并不是固定地從 0 號 bucket 開始遍歷,每次都是從一個隨機值序號的 bucket 開始遍歷,并且是從這個 bucket 的一個隨機序號的 cell 開始遍歷。

如何順序讀取

如果希望按照特定順序遍歷 map,可以先將鍵或值存儲到切片中,然后對切片進行排序,最后再遍歷切片。

改造一下上面的代碼,讓它按順序輸出:

package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]int{
        "apple":  1,
        "banana": 2,
        "orange": 3,
    }

    // 將 map 中的鍵存儲到切片中
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }

    // 對切片進行排序
    sort.Strings(keys)

    // 按照排序后的順序遍歷 map
    for _, k := range keys {
        fmt.Printf("key=%s, value=%d\n", k, m[k])
    }
}

在上面的代碼中,首先將 map 中的鍵存儲到一個切片中,然后對切片進行排序。
最后,按照排序后的順序遍歷 map。這樣就可以按照特定順序輸出鍵值對了。文章來源地址http://www.zghlxwxcb.cn/news/detail-620664.html

推薦閱讀

  • Go 語言教程–介紹(一)
  • Go 語言教程–語言結(jié)構(gòu)(二)
  • Go 語言教程–語言結(jié)構(gòu)(三)
  • Go 語言教程–數(shù)據(jù)類型(四)
  • Go 語言教程–語言變量(五)
  • Go 語言教程–GO語言常量(六)
  • Go 語言教程–GO語言運算符(七)
  • Go 語言教程–GO條件和循環(huán)語句(八)
  • Go 語言教程–GO語言函數(shù)(九)
  • Go 語言教程–GO語言變量作用域(十)
  • Go 語言教程–GO語言數(shù)組(十一)
  • Go 語言教程–GO語言指針(十二)
  • Go 語言教程–GO語言結(jié)構(gòu)體(十三)
  • Go 語言教程–GO語言切片(Slice)(十四)
  • Go 語言教程–Go 語言范圍(Range)(十五)
  • Go 語言教程–Go 語言Map(集合)(十六)
  • Go 語言教程–Go 語言遞歸函數(shù)(十七)
  • Go 語言教程–Go 語言類型轉(zhuǎn)換(十八)
  • Go 語言教程–Go 語言接口(十九)
  • Go 語言教程–Go 錯誤處理(二十)
  • Go 語言教程–Go 并發(fā)(二十一)

到了這里,關于【Golang】Golang進階系列教程--Go 語言 map 如何順序讀???的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Golang】Golang進階系列教程--為什么說 Go 語言字符串是不可變的?

    【Golang】Golang進階系列教程--為什么說 Go 語言字符串是不可變的?

    最近有讀者留言說,平時在寫代碼的過程中,是會對字符串進行修改的,但網(wǎng)上都說 Go 語言字符串是不可變的,這是為什么呢? 這個問題本身并不困難,但對于新手來說確實容易產(chǎn)生困惑,今天就來回答一下。 首先來看看它的底層結(jié)構(gòu): 和切片的結(jié)構(gòu)很像,只不過少了一個

    2024年02月14日
    瀏覽(98)
  • 【Golang】Golang進階系列教程--為什么 Go 不支持 []T 轉(zhuǎn)換為 []interface

    【Golang】Golang進階系列教程--為什么 Go 不支持 []T 轉(zhuǎn)換為 []interface

    在 Go 中,如果 interface{} 作為函數(shù)參數(shù)的話,是可以傳任意參數(shù)的,然后通過類型斷言來轉(zhuǎn)換。 舉個例子: 不管是傳 int 還是 string,最終都能輸出正確結(jié)果。 那么,既然是這樣的話,我就有一個疑問了,拿出我舉一反三的能力。是否可以將 []T 轉(zhuǎn)換為 []interface 呢? 比如下面

    2024年02月15日
    瀏覽(41)
  • 【Golang】Golang進階系列教程--為什么 Go for-range 的 value 值地址每次都一樣?

    循環(huán)語句是一種常用的控制結(jié)構(gòu),在 Go 語言中,除了 for 以外,還有一個 range ,可以使用 for-range 循環(huán)迭代數(shù)組、切片、字符串、map 和 channel 這些數(shù)據(jù)類型。 但是在使用 for-range 循環(huán)迭代數(shù)組和切片的時候,是很容易出錯的,甚至很多老司機一不小心都會在這里

    2024年02月15日
    瀏覽(22)
  • 【Go】Go 語言教程--Go 語言Map(集合)(十六)

    往期回顧: Go 語言教程–介紹(一) Go 語言教程–語言結(jié)構(gòu)(二) Go 語言教程–語言結(jié)構(gòu)(三) Go 語言教程–數(shù)據(jù)類型(四) Go 語言教程–語言變量(五) Go 語言教程–GO語言常量(六) Go 語言教程–GO語言運算符(七) Go 語言教程–GO條件和循環(huán)語句(八) Go 語言教程

    2024年02月16日
    瀏覽(23)
  • 【Golang】Golang進階系列教程--Golang中文件目錄操作的實現(xiàn)

    【Golang】Golang進階系列教程--Golang中文件目錄操作的實現(xiàn)

    Golang中,文件是指計算機中存儲數(shù)據(jù)的實體,文件可以是文本文件、二進制文件、配置文件等。在Go語言中,通過操作文件,我們可以讀取文件的內(nèi)容,寫入數(shù)據(jù)到文件,以及獲取文件的屬性等。 Golang中的文件可以分為兩種類型:文本文件和二進制文件。文本文件是指只包含

    2024年02月15日
    瀏覽(23)
  • 100天精通Golang(基礎入門篇)——第12天:深入解析Go語言中的集合(Map)及常用函數(shù)應用

    100天精通Golang(基礎入門篇)——第12天:深入解析Go語言中的集合(Map)及常用函數(shù)應用

    ?? 博主 libin9iOak帶您 Go to Golang Language.? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~?? ?? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬請批

    2024年02月12日
    瀏覽(27)
  • 100天精通Golang(基礎入門篇)——第15天:深入解析Go語言中函數(shù)的應用:從基礎到進階,助您精通函數(shù)編程?。ㄟM階)

    100天精通Golang(基礎入門篇)——第15天:深入解析Go語言中函數(shù)的應用:從基礎到進階,助您精通函數(shù)編程?。ㄟM階)

    ?? 博主 libin9iOak帶您 Go to Golang Language.? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~?? ?? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬請批

    2024年02月12日
    瀏覽(36)
  • 【GoLang入門教程】Go語言工程結(jié)構(gòu)詳述

    【GoLang入門教程】Go語言工程結(jié)構(gòu)詳述

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站:人工智能 前言 當創(chuàng)建一個Go語言項目時,良好的工程結(jié)構(gòu)是確保項目可維護性、可擴展性和清晰性的關鍵。 雖然Go本身沒有強制性的項目結(jié)構(gòu)要求,但是采用一致性

    2024年01月24日
    瀏覽(99)
  • 5 map、結(jié)構(gòu)體、方法、面向?qū)ο蟆綠o語言教程】

    5 map、結(jié)構(gòu)體、方法、面向?qū)ο蟆綠o語言教程】

    1.1 概念及聲明 ①概念 基本語法:var map 變量名 map[keytype]valuetype key 可以是什么類型? golang 中的 map,的 key 可以是很多種類型,比如 bool, 數(shù)字,string, 指針, channel , 還可以是只包含前面幾個類型的 接口, 結(jié)構(gòu)體, 數(shù)組 通常 key 為 int 、string 注意: slice, map 還有 function 不可以,

    2024年02月02日
    瀏覽(14)
  • 【Golang入門教程】Go語言變量的初始化

    【Golang入門教程】Go語言變量的初始化

    強烈推薦 前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站: 人工智能 推薦一個個人工作,日常中比較常用的人工智能工具,無需魔法,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站: 人工智能工具 引言 在Go語言中,變量

    2024年04月17日
    瀏覽(105)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包