golang 切片和map查询比较

package main

import (
    "fmt"
    "time"
)

var testTimeSlice = []string{"aa", "bb", "cc", "dd", "ee", "aa", "zz"}

var testTimeMap = map[string]bool{"aa": true, "bb": true, "cc": true, "dd": true, "ee": true, "ff": true, "zz": true}

//以上为第一组查询测试数据

var testTimeSlice2 = [] string{"aa", "bb", "cc", "dd", "ee", "aa", "aa", "bb", "cc", "dd", "ee", "aa", "aa", "bb", "cc", "dd", "ee", "aa", "aa", "bb", "cc", "dd", "ee", "aa", "i", "j", "l", "m", "n", "o", "p", "q", "k", "x", "y", "z",
    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "zz"}

var testTimeMap2 = map[string]bool{"aa": true, "bb": true, "cc": true, "dd": true, "ee": true, "ff": true, "qq": true, "ww": true, "rr": true, "tt": true, "zz": true, "uu": true, "ii": true, "oo": true, "pp": true, "lk": true, "kl": true, "jk": true, "kj": true, "hl": true, "lh": true, "fg": true, "gfdd": true, "df": true, "fd": true,
    "i": true, "j": true, "l": true, "m": true, "n": true, "o": true, "p": true, "q": true, "k": true, "x": true, "y": true, "z": true,
    "1": true, "2": true, "3": true, "4": true, "5": true, "6": true, "7": true, "8": true, "9": true, "10": true}

//以上为第二组查询测试数据

func testSlice(a []string) {
    now := time.Now()

    for j := 0; j < 100000; j++ {
        for _, v := range a {
            if v == "zz" {
                break
            }
        }
    }
    finish1 := time.Since(now)
    fmt.Println(finish1)
}

func testMap(a map[string]bool) {
    now := time.Now()
    for j := 0; j < 100000; j++ {
        if ok := a["zz"]; ok{
            continue
        }
    }
    finish2 := time.Since(now)
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    fmt.Println(finish2)
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
}

func main(){
    //slice查询是遍历方式,时间复杂度是O(n), map查询是hash映射
    //当数据量小的时候切片查询比map快,但是数据量大的时候map的优势就体现出来了
    testSlice(testTimeSlice) //999.8μs
    testMap(testTimeMap) //4.9961ms
    testSlice(testTimeSlice2) //5.0147ms
    testMap(testTimeMap2) //3.0003ms
}

原文地址:https://www.cnblogs.com/nyist-xsk/p/11624138.html

时间: 2024-08-30 08:11:39

golang 切片和map查询比较的相关文章

golang自己定义数据类型查询与插入postgresql中point数据

golang自己定义数据类型查询与插入postgresql中point数据 详细代码例如以下: package main import ( "bytes" "database/sql" "database/sql/driver" "fmt" _ "github.com/lib/pq" "strconv" "strings" ) // 自己定义支持类型 type Poi

Golang教程:Map

什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:make(map[KeyType]ValueType).(译者注:map 的类型表示为 map[KeyType]ValueType)例如: personSalary := make(map[string]int) 上面的代码创建了一个名为 personSalary 的 map.其中键的类型为 string

Golang,用map写个单词统计器

Golang中也有实用的泛型编程模板.如map.据Go官方团队称,其实现为Hash表,而非类似cpp或Java的红黑树.所以理论上速度更能快上几个等级(Hash与红黑树的效率对比可以看我的文章C++中各种<string,T>关联方式的速度对比,效率比约为3:1),但有一些区别,就是遍历时,数据是无需且随机的(当然,后文会讲到有序化的方法).接下来,我们先创建一个map对象. dict:=make(map[string]int); 由于map的强类型,所以一切类型是静态的,map也不例外.从ma

golang笔记(1)-数据库查询结果映射至结构体

通用的映射模式 query:="select id,name from user where id=?" //单个结构体ret:=&Activity{} DbClient().Find(query,activityId).Unique(ret)//结构体数组ret:=[]Activity{} DbClient().Find(query,activityId).List(&ret)   1.定义结构体 type Activity struct{ ID int64 `col

【GoLang笔记】实例分析GoLang built-in数据结构map的赋值引用行为

备注1:本文旨在介绍Go语言中map这个内置数据结构的引用行为,并用实例来说明如何避免这种引用行为带来的"副作用". 备注2:文末列出的参考资料均来自GoLang.org官方文档,需翻墙访问. 1. map internals map是go中内置的数据结构,关于其语法规则,可以查看language specification中这里的说明,或者查看Effective Go中关于Maps的说明,此处略过. map的底层是用hashmap实现的(底层hashmap源码路径为src/pkg/r

GO语言数组,切片,MAP总结

数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 数组的长度必须是常量,并且长度是数组类型的一部分.一旦定义,长度不能变.数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic. 数组是值类型,赋值和传参会复制整个数组.因此改变副本的值,不会改变本身的值. 数组声明 var 数组变量名 [元素数量]元素类型 var a [3]int //声明

golang struct转map

struct转map package main import ( "fmt" "reflect" "time" ) type User struct { Id int64 Username string Password string Logintime time.Time } func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v

golang初学之map

package main import ( "strings" "fmt") // 返回各个单词数量统计的map func WordCount(s string) map[string]int { m := make(map[string] int) for _, word := range strings.Fields(s) { m[word] ++ } return m} func main() { fmt.Println(WordCount("I a

golang切片slice

切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, 10) //元素的类型,元素的数量,元素的容量  fmt.Println(len(s2), cap(s2)) 输出元素的数量和容量 2.讲数组转换成切片 2 a := [10]int{} 3 fmt.Println(a) 4 s1 := a[:10] //取前10个元素 [5:]取 5-最后的元素