go
iuouiyiuty
这个作者很懒,什么都没留下…
展开
-
谈谈自己对GO的RWMutex的理解
RWMutex核心还是基于Mutex的,如果想了解Mutex的话可以看一下我上一篇写的Mutex的文章RWMutex的特性就是支持并发读。适用于读多写少的场景。RWMutex的定义type RWMutex struct { w Mutex // 互斥锁 writerSem uint32 // 写锁用的信号量 readerSem uint32 // 读锁用的信号量 readerCount int32 // 当前正在执行读操作的goroutine数量 read.原创 2020-07-25 13:38:59 · 293 阅读 · 0 评论 -
谈谈自己对GO的Mutex的理解
目前GO已经更新到了1.14的版本咱们一般人如果直接去看mutex的源码的话,其实是比较难理解为什么写成了现在这个样子,尤其是加锁里面的各种逻辑判断太多了,各种位运算一脸懵逼,其实我们只要掌握它最初的设计思想,那么后面新增的逻辑,理解起来都很简单了。Mutex最初版本Mutex第一版代码加上注释不过才109行。非常精简,下面介绍一下我对第一版Mutex源码的理解// Mutex有state和sema两个成员变量,这一点是在1.14没有变化的// 其中 state 字段代表当前锁的状态,sema是控原创 2020-07-20 00:11:37 · 193 阅读 · 0 评论 -
go浮点数转字符串保留小数点后N位解决办法
最近在项目中碰到很多次float转string,同时要求保留小数点后几位,并且去掉小数点后0的场景虽然问题很简单,但是隔了挺久没处理这种场景就有些生疏了,自己也搜了一下,很多回答都不太满意。这里贴一下自己的做法,如果有更好的解决办法的话,还请多多指教// 主要逻辑就是先乘,trunc之后再除回去,就达到了保留N位小数的效果func FormatFloat(num float64, decimal int) string { // 默认乘1 d := float64(1) if decima原创 2020-05-08 21:18:50 · 2316 阅读 · 0 评论 -
Go for range常见的坑
在日常开发中,for range肯定是经常用到的,下面我整理了一些自己平常会遇到的坑首先第一个肯定是遍历slice的坑了func main() { arr := []int{1, 2, 3} newArr := []*int{} for _, v := range arr { newArr = append(newArr, &v) } for _, v := range ...原创 2020-03-28 17:16:43 · 1500 阅读 · 1 评论 -
Go防缓存击穿——singleflight
我们在开发时,有时会碰到一个接口的访问量突然上升,导致服务响应延迟或者宕机的情况。这时,除了利用缓存之外,也可以用到singlefilght来解决,下面是一个简单的示例package mainimport ( "fmt" "sync" "sync/atomic" "time" "golang.org/x/sync/singleflight")func main() { g...原创 2020-03-08 17:16:22 · 315 阅读 · 0 评论 -
Go sync.Once介绍
go中sync.Once也是一个工作中会用到的一个类型,它是开箱即用的var once sync.Onceonce.Do(func(){ fmt.Println("do once")})只要声明改类型的once变量,就可以直接使用它的Do方法,Do方法的参数是一个无参数,无返回的函数。它有一个特性,就是不管调用Do方法多少次,里面的函数只会执行一次。我们可以看下它的实现源码,非常精...原创 2020-02-29 19:20:08 · 128 阅读 · 0 评论 -
Go Sync.Pool作用及遇到的坑
Go版本1.13.1Go中有sync.Pool类型,我们可以把它理解成存放临时值的容器,之所以加上“临时”两个字,是因为它会在GC过程的STW步骤被清理。sync.Pool类型使用前可以给它的New字段赋值,New字段类型是func() interface{},一个函数类型,该函数一般在池内为空的时候才会调用sync.Pool有两个公开的方法,一个Put,一个Get,作用看函数名就知道了G...原创 2020-02-28 10:23:56 · 724 阅读 · 0 评论 -
Go控制并发数量的几种方式
因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些?下面是我个人整理的两个例子,如果有不对的地方请轻喷。func waitGroup() { count := 10 wg := sync.WaitGroup{} for i := 0; i < count; i++ { wg.Add(1) go func(j int) { f...原创 2020-02-27 16:41:20 · 1214 阅读 · 1 评论 -
Go关键字defer的特性
Go里面,流程控制语句中有一个defer的关键字,翻译过来就是延迟的意思。下面用代码说话。func deferFunc() { defer fmt.Println("后打印") fmt.Println("先打印")}defer在函数执行完毕之后,才会执行,所以,我们经常在释放资源或异常处理等需要收尾的场景下会用到defer。不过defer也有一些“坑”,大家需要注意一下。func...原创 2020-02-26 14:54:10 · 125 阅读 · 0 评论 -
Go与用户交互demo
大学里大家应该基本上都写过一些和控制台进行交互的课后作业,下面是一个go版本的简单交互程序。package mainimport ( "bufio" "fmt" "os")func main() { in := bufio.NewReader(os.Stdin) // 声明并初始化读取器 fmt.Println("What is your name?") input, e...原创 2020-02-25 13:28:54 · 209 阅读 · 0 评论 -
第一个Go程序
学习一门新的编程语言,当然躲不过hello world了。下面是go版本的hello worldpackage main // 声明自己属于main包import "fmt" // 导入标准库代码包fmt// 入口函数,也称主函数func main() { fmt.Println("Hello World") // 打印Hello World}goland可以直接点run...原创 2020-02-24 15:13:52 · 115 阅读 · 0 评论