
golang
飞飞羽毛球
这个作者很懒,什么都没留下…
展开
-
go-zero源码阅读-固定时间窗口限流
go-zero框架的PeriodLimit限流是固定时间窗口限流,通过lua脚本操作redis, 对key进行计数并搭配过期时间实现限流原创 2023-02-19 22:13:11 · 480 阅读 · 0 评论 -
go-zero源码阅读-RedisLock分布式锁实现
go-zero分布式锁代码文件: core/stores/redislock.go。该分布式锁通过lua脚本使用redis的set命令实现, 整体实现逻辑比较简单。原创 2023-02-15 22:43:27 · 841 阅读 · 0 评论 -
go-zero源码阅读-布隆过滤器
布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。原创 2023-02-05 22:09:52 · 746 阅读 · 0 评论 -
errgroup源码
golang为并发执行提供了WaitGroup工具,方便goroutine执行的控制,但是缺少了error的传递和一个goroutine出错,取消其他goroutine执行能力。通过对WaitGroup的进一步封装,就变成了errgroup,可以很好的解决上述问题。原创 2023-01-15 11:26:16 · 652 阅读 · 0 评论 -
groupcache源码(六)-一致性哈希实现
groupcache分布式集群下,使用了一致性哈希算法原创 2022-10-05 20:57:35 · 192 阅读 · 0 评论 -
groupcache源码(五)-分布式设计
groupcache分布式设计比较简单,各节点通过http进行交互,传输内容为pb格式。并且使用一致性哈希算法减少扩缩容对数据的影响原创 2022-10-05 11:27:26 · 665 阅读 · 0 评论 -
groupcache源码(四)-主数据结构group
group是核心数据结构,对外提供服务,对内进行数据操作原创 2022-10-04 23:19:34 · 245 阅读 · 0 评论 -
groupcache源码(三)-cache对lru的进一步封装
lur.Cache是对数据lru的实现,但并不是并发安全的。groupcache.cache进行了进一步的并发封装原创 2022-10-04 17:53:27 · 354 阅读 · 0 评论 -
groupcache源码(二)-核心数据结构Cache的lru实现
groupcache使用Cache(结构体名)进行数据存储,Cache内部利用lru缓存淘汰策略进行数据淘汰原创 2022-09-25 21:21:17 · 165 阅读 · 0 评论 -
groupcache源码(一)-groupcache使用
groupcache是类似于memcache的分布式储存库,在使用时它既是客户端又是服务端原创 2022-09-25 20:03:20 · 214 阅读 · 0 评论 -
golang源码阅读-sync.map
golang内置的map不是并发安全的,在v1.9版本提供了并发安全的map: sync.mapsync.map的使用方式和map类似,数据存储、获取、删除和遍历如果使用map 加锁进行数据操作时,耗时相对较多,sync.map采用了对数据进行读写分离,读时不加锁,用空间换时间进行read操作时,不需要加锁,数据类型为atomic.Value,保证了数据的获取和将dirty赋值给read时的原子性,数据存储的是readOnly, readOnly内部存储的是值的指针,和dirty值的指针一致原创 2022-06-04 17:25:33 · 251 阅读 · 0 评论 -
gorm-简单使用(一)
一. gorm操作表代码package mainimport ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm")// 表对应的结构体type User struct { Id int `gorm:"primary_key"` Name string Age int Email string}func main() {// 链接mysql db, err := gorm.O原创 2022-04-16 22:58:42 · 851 阅读 · 1 评论 -
golang源码阅读-nsq-消费者代码
1. 基本使用// 消费者type ConsumerT struct{}// 主函数func main() { fmt.Println("---------- start --------") InitConsumer("test", "test-channel", "0.0.0.0:4161") for { time.Sleep(time.Second * 10) }}//接收到消息时, 会调用这个方法,处理消息func (*ConsumerT) HandleMessa原创 2020-07-19 15:49:13 · 547 阅读 · 0 评论 -
golang源码阅读-nsq-生产者代码
1.基本使用var producer *nsq.Producer// 主函数func main() { strIP1 := "127.0.0.1:4150" InitProducer(strIP1) running := true //读取控制台输入 reader := bufio.NewReader(os.Stdin) for running { data, _, _ := reader.ReadLine() command := string(data) if原创 2020-07-03 23:40:31 · 4296 阅读 · 0 评论 -
golang源码阅读-net.Dial
1.基本使用//获取链接conn, err := net.Dial("tcp", "0.0.0.0:8080") if err != nil { fmt.Println("Dial error ", err) return }//通过链接写入数据 conn.Write([]byte("hello everyone"))2.Dial源码func Dial(network, address string) (Conn, error) { var d Dialer//调用D原创 2020-05-24 23:44:40 · 1073 阅读 · 0 评论 -
golang源码阅读-bytes.NewBuffer
1.基本使用func main() { var byteArr []byte buf := bytes.NewBuffer(byteArr) buf.Write([]byte("今天不错")) fmt.Println(buf.String())}2.NewBuffer源码:func NewBuffer(buf []byte) *Buffer {//返回Buffer 结构体实例 传入buf 存到buf中//type Buffer struct {// buf .原创 2020-05-16 22:30:56 · 1696 阅读 · 0 评论 -
golang源码阅读-path
1.IsAbs返回路径是否是一个绝对路径 使用示例: isAbs := path.IsAbs("/root/temp") fmt.Println(isAbs)源码:func IsAbs(path string) bool { //路径长度大于0 并且 第一个字符是 / return len(path) > 0 && path[0] == '/'}2.Split函数将路径从最后一个斜杠后面位置分隔为两个部分(dir和file)并返回。如...原创 2020-05-13 22:25:35 · 398 阅读 · 0 评论 -
golang源码阅读-flag.Int
flag.int使用简单示例func main() { var age = flag.Int("age", 18, "age age") var height = flag.Int("height", 20, "height height") var b = flag.Bool("b", false, "height height") flag.Parse() //flag.Usage() fmt.Printf("age=%d height=%d bool=%t", *age, *he原创 2020-05-10 23:53:29 · 1247 阅读 · 0 评论 -
golang源码阅读-context.WithTimeout
context.WithTimeout 可用于一定时间关闭函数或调用,如调用超时,主动关闭调用1.context.WithTimeout简单使用func main() { ctx, _ := context.WithTimeout(context.Background(), 4*time.Second) printNum2(ctx)}func printNum2(ctx context.Context) { //要打印的数字 n := 0 for { select { ca原创 2020-05-10 12:00:18 · 1556 阅读 · 0 评论 -
golang源码阅读-context.WithCancel
1. 当我们调用某些方法时,因为一些情况希望该方法停止执行可以用 withCancel, context.WithCancel使用示例func main() { ctx, cancel := context.WithCancel(context.Background()) numChan := printNum(ctx) for n := range numChan { if ...原创 2020-05-05 22:32:55 · 1040 阅读 · 0 评论 -
golang源码阅读-strings
1. 判断一个字符串的前缀是否为另一个字符串hasStrPrefix := strings.HasPrefix("jin tian tian qi hao", "jin tian") 源码:func HasPrefix(s, prefix string) bool { return len(s) >= len(prefix) && s[0:len(pref...原创 2020-05-04 23:19:56 · 471 阅读 · 0 评论 -
golang之时间
1.获取时间戳t := time.Now().Unix() //15569522342.获取当前日期time.Now().Format("2006-01-02 15:04:05") //2019-05-04 14:43:543.日期转时间戳loc, _ := time.LoadLocation("Local") timeFormat, err := time....原创 2019-05-04 14:53:14 · 204 阅读 · 0 评论 -
golang之字符串操作
1.字符串在另一个字符串第一次出现的位置str := "hello world"fmt.Println(strings.Index(str, "world")) //62.字符串在另一个字符串最后一次出现的位置fmt.Println(strings.LastIndex(str, "l")) //93.切割字符串fmt.Println(strings.Split(...原创 2018-09-13 22:04:49 · 767 阅读 · 0 评论 -
golang之切片
切片类似于java中的集合,底层为数组,当元素个数达到一定量,则自动进行扩容1.声明切片的两种方式arr := [...]int{1, 5, 6}s := arr[:2] //方法1s := make([]int, 5, 10) //方法2方法1: 在数组上截取一部分,分号左侧为开始位置,没有数则为0,分号右侧为结束位置,没有数代表数组最后一位方法2: 使用make...原创 2018-09-02 22:53:57 · 522 阅读 · 0 评论 -
golang之数组
1.声明数组var arr [5]int2.数组长度arrLen := len(arr)3.数组第一个元素arr[0]4.数组最后一个元素last := arr[arrLen-1]5.遍历数组for key, value := range arr { fmt.Printf("key:%d,value:%d\n", key, value)}...原创 2018-09-02 22:15:19 · 1610 阅读 · 0 评论