最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang 如何獲取map所有key的方式

 更新時間:2021年04月25日 09:22:33   作者:YZF_Kevin  
這篇文章主要介紹了golang 獲取map所有key的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

最佳方式:根據(jù)map的長度,新建一個數(shù)組,遍歷map逐個壓入

方法1(效率很高):

func getKeys1(m map[int]int) []int {
 // 數(shù)組默認(rèn)長度為map長度,后面append時,不需要重新申請內(nèi)存和拷貝,效率很高
 j := 0
 keys := make([]int, len(m))
 for k := range m {
  keys[j] = k
  j++
 }
 return keys
}

方法2(效率很高):

func getKeys2(m map[int]int) []int {
 // 數(shù)組默認(rèn)長度為map長度,后面append時,不需要重新申請內(nèi)存和拷貝,效率很高
 keys := make([]int, 0, len(m))
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}

其他方式:

方法3(效率較低):

func getKeys3(m map[int]int) []int {
 // 注意:由于數(shù)組默認(rèn)長度為0,后面append時,需要重新申請內(nèi)存和拷貝,所以效率較低
 keys := []int{}
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}

方法4(效率極低):

func getKeys4(m map[int]int) int {
 // 注意:雖然此寫法簡潔,但MapKeys函數(shù)內(nèi)部操作復(fù)雜,效率極低
 keys := reflect.ValueOf(m).MapKeys()
 return len(keys)
}

實驗結(jié)果如圖(可以看到方法1和方法2效率最高,內(nèi)存操作也最少):

完整代碼如下:

package test
 
import (
 "reflect"
 "testing"
)
 
// 初始化map
func initMap() map[int]int {
 m := map[int]int{}
 for i := 0; i < 10000; i++ {
  m[i] = i
 }
 return m
}
 
func getKeys1(m map[int]int) []int {
 // 數(shù)組默認(rèn)長度為map長度,后面append時,不需要重新申請內(nèi)存和拷貝,效率較高
 j := 0
 keys := make([]int, len(m))
 for k := range m {
  keys[j] = k
  j++
 }
 return keys
}
 
func getKeys2(m map[int]int) []int {
 // 數(shù)組默認(rèn)長度為map長度,后面append時,不需要重新申請內(nèi)存和拷貝,效率較高
 keys := make([]int, 0, len(m))
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}
 
// 初始化默認(rèn)
func getKeys3(m map[int]int) []int {
 // 注意:由于數(shù)組默認(rèn)長度為0,后面append時,需要重新申請內(nèi)存和拷貝,所以效率較低
 keys := []int{}
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}
 
// 使用反射
func getKeys4(m map[int]int) int {
 // 注意:雖然此寫法簡潔,但MapKeys函數(shù)內(nèi)部操作復(fù)雜,效率極低
 keys := reflect.ValueOf(m).MapKeys()
 return len(keys)
}
 
func BenchmarkMapkeys1(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys1(m)
 }
}
func BenchmarkMapkeys2(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys2(m)
 }
}
 
func BenchmarkMapkeys3(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys3(m)
 }
}
 
func BenchmarkMapkeys4(b *testing.B) {
 // 初始化map
 m := initMap()
 
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  getKeys4(m)
 }
}

補充:Golang踩坑——判斷map中是否有key

最近在實習(xí),下班回去十點多了,再加上比較懶,快有兩個月沒寫東西了。

今天在開發(fā)一個模塊的時候是接著上一個人的寫的,好不容易各種配置寫好了開始跑,發(fā)現(xiàn)他踩了一個很容易踩的坑。

把bug抽出來單獨寫了個文件

package main
 
import (
	"log"
)
 
type agent struct {
	id  int
	str string
}
 
var m map[int]*agent 
func main() {
	m = make(map[int]*agent)
	a := &agent{
		id:  1,
		str: "hello",
	}
	log.Println(a)
	var ok bool
	if a, ok = m[1]; ok {
		log.Println("ok")
	}
	m[1] = a
	log.Println(a)
	log.Println(a.str)
}

運行一下

可以看到報了無效指針的問題(invalid memory address or nil pointer dereference)。

從上面的兩個log可以看到,最開始指針是有值的,第二個卻沒了,原因就出現(xiàn)在那個if判斷那里。

if判斷是想通過查看map知道agent是否已經(jīng)存在,這個地方的錯誤是a,ok = map; 我們想通過ok判斷是否存在,但是在這里還有個a,這會導(dǎo)致有一個對a賦值的操作,也就是說如果map里有這個值,那沒事,如果沒有的話a就被賦值成了nil了。

在下面打印的時候也就成了nil,取它的屬性的時候會告訴我們找了個空指針的屬性,這肯定找不到。

我們把a換成_,再來看結(jié)果:

ok了。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go中map數(shù)據(jù)類型3點小知識

    Go中map數(shù)據(jù)類型3點小知識

    這篇文章主要介紹了Go中map數(shù)據(jù)類型3點小知識,在go中使用map時可能會用本文中的小知識,需要的朋友可以參考下
    2014-10-10
  • golang實現(xiàn)對JavaScript代碼混淆

    golang實現(xiàn)對JavaScript代碼混淆

    在Go語言中,你可以使用一些工具來混淆JavaScript代碼,一個常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過Go語言的`os/exec`包來調(diào)用Terser工具,本文給通過一個簡單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01
  • 深入了解Golang中的Slice底層實現(xiàn)

    深入了解Golang中的Slice底層實現(xiàn)

    本文主要為大家詳細(xì)介紹了Golang中slice的底層實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-02-02
  • Go標(biāo)準(zhǔn)庫常見錯誤分析和解決辦法

    Go標(biāo)準(zhǔn)庫常見錯誤分析和解決辦法

    Go語言的標(biāo)準(zhǔn)庫為開發(fā)者提供了豐富且高效的工具,涵蓋了從網(wǎng)絡(luò)編程到文件操作等各個方面,然而,標(biāo)準(zhǔn)庫雖好,使用不當(dāng)卻可能適得其反,正所謂"工欲善其事,必先利其器",本文將深入剖析Go標(biāo)準(zhǔn)庫使用中的常見錯誤,幫助開發(fā)者避開這些坑,寫出更加健壯的代碼
    2025-04-04
  • go語言讀取csv文件并輸出的方法

    go語言讀取csv文件并輸出的方法

    這篇文章主要介紹了go語言讀取csv文件并輸出的方法,實例分析了go語言操作csv文件的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言單向通道的實現(xiàn)

    Go語言單向通道的實現(xiàn)

    本文主要介紹了Go語言單向通道的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 深入理解Go設(shè)計模式之代理模式

    深入理解Go設(shè)計模式之代理模式

    代理模式是一種結(jié)構(gòu)型設(shè)計模式,?其中代理控制著對于原對象的訪問,?并允許在將請求提交給原對象的前后進(jìn)行一些處理,從而增強原對象的邏輯處理,這篇文章主要來學(xué)習(xí)一下代理模式的構(gòu)成和用法,需要的朋友可以參考下
    2023-05-05
  • Windows下Goland的環(huán)境搭建過程詳解

    Windows下Goland的環(huán)境搭建過程詳解

    這篇文章主要介紹了Windows下Goland的環(huán)境搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • golang之?dāng)?shù)據(jù)校驗的實現(xiàn)代碼示例

    golang之?dāng)?shù)據(jù)校驗的實現(xiàn)代碼示例

    這篇文章主要介紹了golang之?dāng)?shù)據(jù)校檢的實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Golang通脈之map詳情

    Golang通脈之map詳情

    這篇文章主要介紹了Golang通脈之map,Go語言中提供的映射關(guān)系容器為map,其內(nèi)部使用散列表(hash)實現(xiàn),map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值 map 是一種集合,所以可以像迭代數(shù)組和切片那樣迭代它
    2021-10-10

最新評論

鄄城县| 兴国县| 辽宁省| 长海县| 炉霍县| 边坝县| 开阳县| 西贡区| 永春县| 南皮县| 子长县| 咸丰县| 弋阳县| 大田县| 天镇县| 泽普县| 那坡县| 新密市| 深水埗区| 马公市| 新巴尔虎右旗| 安新县| 炉霍县| 尚义县| 沛县| 温宿县| 民丰县| 淅川县| 股票| 上高县| 灵寿县| 桐柏县| 贞丰县| 长汀县| 盈江县| 五家渠市| 廉江市| 酉阳| 奉贤区| 汝阳县| 宁津县|