patrickmn/go-cache源码阅读与分析

2023-09-22
阅读 5 分钟
887
go-cache广泛使用在go语言编程中,适合迎来在单机上 存储键值对形式的内存缓存。在github上地址为 [链接]他在并发的时候,线程安全(读写锁) + map[string]interface{} + 过期时间 来作为go的本地化存储。这也是他的三大特性:

singleflight源码分析与缓存雪崩的应用

2023-09-21
阅读 9 分钟
696
我们在重启pod的时候,此时会导致gocache中重启,然后缓存同时大批量失效。如果此时并发比较高,会有很多goroutine,去同时访问redis。加单飞,将一组相同的请求合并成一个请求,实际上只会去请求一次,然后对所有的请求返回相同的结果

go内存缓存BigCache源码阅读-Entry封装

2023-09-05
阅读 2 分钟
661
一、介绍在bigcache存储中,数据值存储的形式为[]byte。我们通过一个,存储的时候,同时会把 hash值,key长度以及值,时间戳,entry同时存起来。

go内存缓存BigCache源码阅读-BytesQueue 实现

2023-09-04
阅读 3 分钟
673
在 bigCache 中,所有的 value 都是存在一个 BytesQueue 中的,从实现可知,所有的用户存储数据经由序列化后存入 array []byte

go内存缓存BigCache源码阅读,如何new一个bigcache对象

2023-09-01
阅读 6 分钟
746
在github上,地址github.com/allegro/bigcache,我们可以把代码源码clone到本地。这里选择分支v3.1.0的代码。

go内存缓存BigCache使用入门

2023-08-31
阅读 3 分钟
1.6k
bigcache是一个内存缓存系统,用于存储键值对数据。没有gc操作。使用的时候需要序列化(反)。bigcache的源代码在 [链接]几个特征,存储通过[]byte,没有过期时间。

go语言sync.map源码阅读-基于go1.20

2023-02-08
阅读 17 分钟
1.4k
sync.Map,是一种可以像Go语言中的Map那样以Key/Value格式将值存储在内存中。sync通用Mutex,可以在多个goroutine并发执行上也可以安全使用。我们可以把它当做和gocache或者Redis一样的缓存来使用。适用的场景为 写少,读多的地方。我们在命令行中输入:go doc sync.map基于go1.20版本,可以使用的功能如下。

go源码阅读 实现itoa()

2022-08-16
阅读 2 分钟
924
2.1、如果整数0 返回"0"2.2、生成一个int对应的字符数组,比如1234,变成byte['1','2','3','4','5']2.3、把字符数组byte['1','2','3','4','5']变成 string

go源码阅读 使用os.Stat() 获取 file 文件信息

2022-08-16
阅读 2 分钟
2.6k
一、建立一个文件a.txt {代码...} 二、使用 os.Stat() 获取 file 文件信息打开 stat_test.go 输入: {代码...} 输出: {代码...} 三、os.Stat()源码分析在源码src/os/stat.go我们可以看到 {代码...} 我们在看一下 FileInfo 接口 {代码...} 我们在看一下 FileMode 数据结构 {代码...} 四、FileInfo的不同操作系统实现我是...

go byte字节与ascii码

2022-08-13
阅读 2 分钟
3.8k
一、ascii码介绍ascii码总有有 128位,用来表示常用的字符。在go语言中我们用 byte 一个 uint8 (0-255)来展示ascii字符。二、go表示ascii码 0-91、表示ascii的0-9在ascii吗中ascii字符10进制'0'48'1'49'2'50'3'51'4'52'5'53'6'54'7'55'8'56'9'57我们用go语言打印一下: {代码...} 输出: {代码...} 2、byte字符数组 转字...

go切片复制 copy() -更像是一种指定开始索引的替换

2022-08-10
阅读 4 分钟
1.6k
go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。

go源码阅读 strings.Compare 字符串比较

2022-07-29
阅读 1 分钟
618
一、介绍在编程中,我们需要经常的进行字符串比较我们主要用4中比较操作符 {代码...} 二、相等 {代码...} 输出 : {代码...} 谢谢您的观看,欢迎关注我的公众号。

go源码阅读 strings.ToLower , strings.ToUpper核心原理解析

2022-07-27
阅读 3 分钟
1.2k
转化小写的思路是,只要在遍历字符,只要在 A-Z,就转化a-z而他们之间相差一个 'a'-'A'的大小。小写比大写大 'a'-'A'的大小。

go 源码阅读 strings.Builder 与 += 拼接区别

2022-07-25
阅读 2 分钟
870
这是最常用也是最简单直观的方法,不过简单是有代价的,golang的字符串是不可变类型,也就是说每一次对字符串的“原地”修改都会重新生成一个string,再把数据复制进去,这样一来将会产生很可观的性能开销,稍后的性能测试中将会看到这一点。

go 源码阅读 container/list

2022-07-22
阅读 2 分钟
817
go语言提供了原生的双向链表,在源码 src/container/list/list.go双向链表中,每一个元素有prev,和next两个方向。源码中元素Element对应的 结构体为:

go 源码阅读 struct json 格式 tag 标签

2022-07-21
阅读 3 分钟
1.4k
需要解析的字段,Key,第一个字母需要大写。tag之间通过","分割,第一个是name,可以不写。源码src/encoding/json/tags.go

go for循环中的作用域

2022-07-20
阅读 3 分钟
1.1k
上面的代码,最后没有输出。我们的期望输出 0 1 的愿望落空了,什么原因?程序执行时间图如上图,我们发现在上面的程序有2种情况1.当主进程结束,goroutine2,goroutine3 都还没执行完,则没有输出。2.情况2,如下图 goroutine2 执行完,输出了1 !!!!注意不是0!!!!从上面学到的解决竞态4中方案,我们用waitGroup阻塞...

go源码阅读 context

2022-07-20
阅读 3 分钟
1.1k
我们在命令行 输入 go doc context 可以看到多 context包的介绍。context上下问,是连接不同的goroutine,让每个协程可以有父子关系,并且拥有自己的独特的值WithValue(),或者处理超时WithTimeout(),定时WithDeadline(),取消协程WithCancel()操作。在go官方博客[链接]也有想起的介绍。

go源码阅读 container/ring

2022-07-18
阅读 2 分钟
670
一、介绍ring是一个首尾相连的list,源码位于 src/container/ring/ring.go 其中每一个元素的定义如下: {代码...} Ring结构中,只有一个Value存储值,以及指向prev以及next的指针地址。通过New方法可以创建一个特定大小的ring,例如: {代码...} 我们可以看下源码: {代码...} 1.1 ring.New(0) 是一个nil我们使用 ring.N...

go源码阅读database/sql

2022-07-14
阅读 9 分钟
1.4k
当我们使用不同的数据库的时候,只要把使用的驱动注册进去就可以了。比如在 github.com/go-sql-driver/mysql mysql驱动库里。有一段代码github.com/go-sql-driver/mysql/driver.go

go源码阅读database/sql/driver(接口) 与mysql 实现( go-sql-driver库)

2022-07-14
阅读 4 分钟
1.4k
一、driver简介database/sql 是一个给sql-like数据库使用的官方库,主要实现了driver (sql-like)数据库的驱动接口sql相关的方法在地址 [链接]有具体实现了database/sql的sql-like驱动库列表 在这里用了一个策略模式的编程方式。在 go源码 src/database/sql/sql.go有一个注册driver方法: {代码...} 在每一个driver驱动实...

go源码阅读 reflect struct (go反射与struct结构体)

2022-07-11
阅读 5 分钟
1.4k
一、介绍reflect包主要用来检查interface{}类型的类型type和值value。我们可以用 {代码...} 在reflect包里,struct里的字段使用 StructField结构体表示 {代码...} 二、reflect.Type在这里我们以struct举例:打开源码 src/reflect/type.go {代码...} 本文主要截取了reflect.Type的6个方法以及StructField结构体的field字...

go string to time (字符串转时间戳)

2022-07-11
阅读 1 分钟
1.4k
{代码...} 我们调用一下试试: {代码...} 输出: {代码...} 谢谢您的观看,欢迎关注我的公众号。

golang操作clickhouse使用入门

2022-07-07
阅读 3 分钟
13.7k
一、介绍这里使用 [链接]来做go语言调用clickhouse数据的 client 库我们会从一般数据库的,增删改查,来介绍简单的使用。使用1.x版本的 clickhouse-go引入下面两个包就可以使用 {代码...} 创建clickhouse 表 {代码...} 存一些数据进去如下:对应的结构体为 User,字段通过tag与数据库中hi_test_user表的列一致。 {代码......

Go的省略符 omitempty和 - 两种方式详解

2022-07-05
阅读 4 分钟
9.2k
omitempty如果字段的值为空值(定义为 false、0、nil 指针、nil 接口值以及任何空数组、切片、映射或字符串),该选项在编码期间忽略该字段

go nil 是什么

2022-07-01
阅读 1 分钟
663
一、介绍nil是在go中的一个变量。在源码 src/builtin/builtin.go {代码...} nil是一个零值, {代码...} 谢谢您的观看,欢迎关注我的公众号。

go 协程常见问题总结

2022-06-30
阅读 1 分钟
831
一、结构体1.1 先看下如下的问题,我们想开一个go协程打印 {代码...} {代码...} 两个都是输出[]: {代码...} 和我们预想的不一样,原以为是输出 [1,2,3,4,5],结果是[],因为tt.I = nil 先执行了。在go func()之前,能确定是顺序执行,但在go func()之后,是没法确定,哪个协程先执行的。执行顺序是未知的。正确使用方法...

go算法实现:快排 quick sort

2022-06-23
阅读 2 分钟
1.9k
快排排序是由东尼·霍尔所发展的一种排序算法。在平均情况下,它的时间复杂度是Ο(nlogn),在最坏的情况下是Ο(n2),不过这种情况不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,快排是最快的排序算法之一。快速排序使用分治法(Divi...

go源码阅读sort包3种类型排序

2022-06-22
阅读 3 分钟
977
一、介绍go doc sort.sort 包,查看包主要功能函数输出: {代码...} 只有一个Sort函数,参数为实现了len(),less(),swap(),三个方法的Interface 接口。二、排序整数、浮点数和字符串切片对于 []int, []float, []string 这种元素类型是基础类型的切片使用 sort 包提供的下面几个函数进行排序。 {代码...} 使用示例如下: ...

go 编译标签( build tag)-注释里的编译语法

2022-06-20
阅读 2 分钟
6.6k
一、介绍在Go中,build tag是添加到我们的代码中第一行,来标识编译相关的信息。其决定了当前文件是否会被当前 package 所包含。用于限制一整个文件是否应该被编译入最终的二进制文件,而不是一个文件中的部分代码片段 go 编译标签(build tag)语法如下: {代码...} Build tags文件顶部附近,前面只能有空行和其他行注释...