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

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

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

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

方法1(效率很高):

func getKeys1(m map[int]int) []int {
 // 數(shù)組默認長度為map長度,后面append時,不需要重新申請內存和拷貝,效率很高
 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ù)組默認長度為map長度,后面append時,不需要重新申請內存和拷貝,效率很高
 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ù)組默認長度為0,后面append時,需要重新申請內存和拷貝,所以效率較低
 keys := []int{}
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}

方法4(效率極低):

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

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

完整代碼如下:

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ù)組默認長度為map長度,后面append時,不需要重新申請內存和拷貝,效率較高
 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ù)組默認長度為map長度,后面append時,不需要重新申請內存和拷貝,效率較高
 keys := make([]int, 0, len(m))
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}
 
// 初始化默認
func getKeys3(m map[int]int) []int {
 // 注意:由于數(shù)組默認長度為0,后面append時,需要重新申請內存和拷貝,所以效率較低
 keys := []int{}
 for k := range m {
  keys = append(keys, k)
 }
 return keys
}
 
// 使用反射
func getKeys4(m map[int]int) int {
 // 注意:雖然此寫法簡潔,但MapKeys函數(shù)內部操作復雜,效率極低
 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

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

今天在開發(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是否已經存在,這個地方的錯誤是a,ok = map; 我們想通過ok判斷是否存在,但是在這里還有個a,這會導致有一個對a賦值的操作,也就是說如果map里有這個值,那沒事,如果沒有的話a就被賦值成了nil了。

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

我們把a換成_,再來看結果:

ok了。

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

相關文章

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

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

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

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

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

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

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

    Go標準庫常見錯誤分析和解決辦法

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

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

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

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

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

    深入理解Go設計模式之代理模式

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

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

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

    golang之數(shù)據校驗的實現(xiàn)代碼示例

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

    Golang通脈之map詳情

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

最新評論

乌兰县| 讷河市| 岳池县| 于都县| 九江市| 金塔县| 连山| 紫阳县| 屏山县| 崇左市| 安陆市| 格尔木市| 颍上县| 五莲县| 汝南县| 韩城市| 贡山| 盐池县| 安阳县| 屯留县| 南开区| 驻马店市| 娄烦县| 神池县| 罗甸县| 通榆县| 巴塘县| 黎平县| 苗栗县| 文山县| 安达市| 丹寨县| 桐庐县| 荔波县| 周至县| 兴安县| 周口市| 墨竹工卡县| 东至县| 札达县| 仪陇县|