
Go
文章平均质量分 65
Mr.禾
这个作者很懒,什么都没留下…
展开
-
go 语言 比较两个切片(slice)、哈希表(map)是否相等
利用reflect.DeepEqual函数判断是否相等package mainimport ( "fmt" "reflect")func slice_demo() { str1 := []string{"123", "hwt"} str2 := []string{"123", "hwt"} str3 := []string{"hwt", "123"} ok := reflect.DeepEqual(str1, str2) if ok { fmt.Println("str1 =原创 2022-04-26 11:13:53 · 2872 阅读 · 0 评论 -
Go 语言 map源码分析及图解 (二)(map扩容)
文章目录扩容总流程map基本结构及hash值查找流程扩容触发条件新桶创建(hashGrow)桶的数据迁移(evacuate)map基本的结构及查找、写入、删除K/V值的具体分析见上一节扩容总流程在mapassign函数写入K/V值后进行扩容条件判断:(1)负载因子大于6.5,也就是元素总数 / 总桶数 > 6.5时,触发翻倍扩容(2)溢出桶过多,一般发生于持续写入数据又全部删除时,触发等量扩容hashGrow函数负责创建新桶,分配内存空间,注意此时并没有进行旧桶的数据迁移,而是把迁移操作原创 2022-04-18 11:31:43 · 1144 阅读 · 1 评论 -
Go 语言 map源码分析及图解(一)(查找、写入、删除K/V值)
map基本结构hmap是map的核心数据结构:type hmap struct { count int // 当前的元素个数 flags uint8 B uint8 // 桶的数量为2的B次方,方便进行哈希的与运算 noverflow uint16 // 溢出桶的数量 hash0 uint32 // 哈希种子,计算哈希值使用 buckets unsafe.Pointer // 桶的数量,为2的B次方 oldbuckets unsafe.Po原创 2022-04-18 10:59:22 · 1128 阅读 · 0 评论 -
Go语言 Channel管道的源码分析及图解
文章目录Channel概述Channel结构体信息Channel创建chansend发送1. 直接发送流程图2. 写入缓冲区流程图3. 发送阻塞挂起chanrecv接收1. 直接接收流程图(无缓冲区)2. 直接接收流程图(带缓冲区)3. 从缓冲区接收4. 接收阻塞挂起Channel概述Channel通过通信的方式在goroutine之间共享内存,是支撑Go语言高性能并发编程模型的重要结构,本文将分析Channel相关的创建、发送、接收、关闭函数的源代码。ps:源代码只给出了重要逻辑核心部分Chann原创 2022-04-05 17:46:21 · 1429 阅读 · 0 评论 -
Go语言 context的源码分析与典型使用(WithCancel,WithTimeout,WithDeadline,WithValue)
文章目录context原理Context基本结构WithCancelWithTimeout,WithDeadlineWithValue代码实现context原理context 主要用来在 goroutine 之间传递上下文信息,包括取消信号(WithCancel)、超时时间(WithTimeout)、截止时间(WithDeadline)、键值对key-value(WithValue)Context基本结构源码中Context接口如下:type Context interface { Deadl原创 2022-04-04 11:09:42 · 1003 阅读 · 0 评论 -
Golang for-range 中的指针内存问题
记录一下使用range遍历遇到的bug,想用另一个数组或切片去存储range中的value地址时会储存一样的值,见代码package mainimport "fmt"func main() { arr := []int{1, 2, 3} newArr := []*int{} for idx, v := range arr { fmt.Printf("[idx]=%d,[&v]=%p\n", idx, &v) newArr = append(newArr, &v原创 2022-03-31 15:28:49 · 958 阅读 · 0 评论 -
go 连接Redis数据库 链接池技术
概述(1)提前准备好一定数量的链接,放入到链接池中。(2)Go需要操作redis时,直接从链接池中取出连接使用就可,节省了临时获取redis链接的时间,提高效率(3)链接池中的链接数量应该实现动态增长或减少来满足高并发请求go连接redis数据库基本操作见go连接redis代码实现package mainimport ( "fmt" "github.com/garyburd/redigo/redis")var pool *redis.Poolfunc init(){ poo原创 2021-04-05 19:40:24 · 224 阅读 · 0 评论 -
go 连接Redis数据库
下载gitgit下载添加环境变量GOPATH目录下测试下载redis库在GOPATH目录下执行此命令go get github.com/garyburd/redigo/redissrc下面会多出github文件代码实现(string)package mainimport ( "fmt" "github.com/garyburd/redigo/redis" //下载的redis包路径)func main(){ //通过go向redis写入读取数据 conn,er原创 2021-04-05 19:08:53 · 240 阅读 · 0 评论