golang
牛气的潘小花
这个作者很懒,什么都没留下…
展开
-
golang map设计思想
golang map的使用:参考:由浅入深聊聊Golang的map_咖啡色的羊驼-CSDN博客_golang mapgolang map的设计思想:参考:【Golang】Map长啥样儿?_哔哩哔哩_bilibili1.首先golang的map实际上就是一个hash表,首先按照key-value存储,对key进行哈希然后存到value中,如果value冲突了,就在相同位置新增一个链表,将新的value存储到链表中。2.key的定位根据key的的高8位对桶的数量进行哈希,然后分配到不同.原创 2021-12-26 19:43:53 · 225 阅读 · 0 评论 -
golang 两个nil不一定相等
参考:Golang: 什么时候nil != nil_MoFengLan的专栏-CSDN博客总结一下,就是一个一个interface的nile和一个*int类型的nil比较是否“==”时,需要比较类型和值。但是interface类型是在运行时确定类型的,随时会变。因此会出现两个nil不相等的情况。方便记忆,可以记为:interface被确定的赋值了,才会相等:如果interface被确定赋值为nil,那interface就与nil相等,但是与值为nil的*int不等;如果interface原创 2021-12-20 19:30:07 · 715 阅读 · 0 评论 -
go内存泄露
golang能够GC是程序声明的变量,而一些外部资源是不可以GC掉的,比如os.OpenFile打开的文件句柄,sql.Open打开的数据库连接句柄等资源。内存泄露,十次有九次都是goroutine泄露pprof实战实战Go内存泄露 - Go语言中文网 - Golang中文社区...原创 2021-12-20 18:45:14 · 479 阅读 · 0 评论 -
golang里面struct和map的比较
参考:Go语言 struct结构体 能比较么 == 或 !=_daima_caigou的博客-CSDN博客_go struct能不能比较golang key map 所有_Golang:map的比较-Go语言中文社区_weixin_29179583的博客-CSDN博客总结下,就是:map和slice这种不能直接用==操作符进行比较,要用refeltc.DeepEqual进行比较。对于struct,如果struct里面没有map、slice这种不能直接比较的,那这个struct就可以比较;原创 2021-12-20 17:51:22 · 649 阅读 · 0 评论 -
限制goroutine的数量
1.首先得知道,GOMAXPROCS指的是GMP调度模型中M的数量,一般情况下是和cpu的核数一致,可以显示的调用runtime.GOMAXPROCS来设置为最大的cpu核数,但是如果不调用,自动也会设置为这个值。所以GOMAXPROCS并不能设置最大并发的goroutine的数量2. goroutine的数量也不能无限制的变多,因为无限新增的话会耗尽资源。所以怎么解决呢?需要用协程池,但实际上协程池也是用channel来实现的。每次新增goroutine的时候写入channel,当channe原创 2021-12-20 17:28:08 · 846 阅读 · 0 评论 -
golang触发gc的时机
参考:Golang什么时候会触发GC - 简书总结一下,一共有主动和被动两种:主动就是:RD调用runtime.GC来触发,但是一般不会自己调被动就是分为两种:一种是搞一个定时器,定时来GC;一种是给内存搞一个上限,到达上限就自动触发。但是问题是,什么时候被动触发呢?一开始的思路是:在go框架或者公司内部平台配置的。但实际上是在go标准库里面搞的。具体代码位置是:/usr/local/Cellar/go/1.16.5/libexec/src/runtime/proc.go 里..原创 2021-12-20 16:44:18 · 1348 阅读 · 0 评论 -
golang减少gc的方法
参考:golang gc优化的几个点_boshuzhang的专栏-CSDN博客1,函数尽量不要返回map, slice对象, 这种频繁调用的函数会给gc 带来压力。 2,小对象要合并。 3,函数频繁创建的简单的对象,直接返回对象,效果比返回指针效果要好。 4,避不开,能用sync.Pool 就用,虽然有人说1.10 后不推荐使用sync.Pool,但是压测来看,确实还是用效果,堆累计分配大小能减少一半以上。 5,类型转换要注意,官方用法消耗特别大,推荐使用雨痕的...转载 2021-12-20 16:05:22 · 1206 阅读 · 0 评论 -
进程、线程和协程
参考:进程线程和协程 - Go语言中文网 - Golang中文社区写了一年golang,来聊聊进程、线程与协程 - 捉虫大师 - 博客园总结下,就是:进程:一个正在运行中的程序,就是一个进程,是操作系统可以分配的最小的资源分配单元。因为单个进程在执行io等操作时会阻塞,因此搞了多进程。但是多进程会涉及到切换进程的过程,这个过程中切换上下文需要耗费很多资源,所以搞了多线程。线程:一个进程可以有多个线程,且线程之间共享内存,所以线程间切换上下文的开销很小。但是在高并发的场景下,要原创 2021-12-20 15:46:29 · 388 阅读 · 0 评论 -
empty slice和nil slice的区别
(1)如果是var s1 []int这种 s1就是一个nil,没有被初始化(2)如果是 s1:=[]int{} s1 := make([]int,0),这种就只是一个empty slice,是完成了初始化的(3)经过测试,map和slice是一样的原创 2021-12-20 14:43:20 · 307 阅读 · 0 评论 -
golang中new和make的区别
(1)new返回的是指针,make返回的是对象的引用(2)new可以作用于所有类型,make只能作用于slice、map和channel(3)new只是分配了一块内存,并没有对对象进行初始化;make是分配内存的同时进行初始化原创 2021-12-20 14:42:46 · 221 阅读 · 0 评论 -
golang 内存逃逸
参考:Golang内存分配逃逸分析 - jimshi - 博客园GO语言变量逃逸分析 - Go语言中文网 - Golang中文社区总结下,就是:1. 堆和栈之前写c++的时候,栈是各种局部变量,函数结束就自动释放;堆就是使用new和malloc分配的,需要rd去关注啥时候分配,啥时候释放。在栈上分配内存比较快,而且回收也快,在堆上分配就耗费的资源比较多。而且,在栈上面分配的,函数结束后就自动回收了,只有全局的栈上的变量和堆上的变量,才需要GC回收,减少堆上分配内存的同时,也减轻了gc..原创 2021-12-18 22:37:40 · 641 阅读 · 0 评论 -
golang context
参考:Golang中 Context包深入浅出 - 简书简单总结下:1.为啥要用contextgo并发中,如果是简单地等待每个协程结束,就用waitGroup;如果是需要一个后台一直跑的协程(比如监控,启动的时候一直跑,等main结束时也结束),就可以用select+chan;如果需要多个goroutine进行一系列的负责的编排,就建议用context2.context(1)context的方法context主要是有几个方法:Done:判断context是不是被取消或者超时,原创 2021-12-18 19:33:37 · 431 阅读 · 0 评论 -
channel
1.go并发常用的方法并发分为两种,一种是数据共享,一种是将一个go的所有权交给另一个;(1).如果是简单的map、slice这种并发,可以用简单地加锁解锁来解决;(2).如果是简单的等所有goroutine协程都结束,可以用waitGroup(3) 如果是比较复杂的goroutine协程编排,需要用channel(4) 如果是和超时有关的,需要用channel和context2.会导致panic(1)close为nil的chan(2)往已经close的chan里面sen原创 2021-12-16 22:48:15 · 144 阅读 · 0 评论 -
goroutine调度策略
Go语言的GPM调度器是什么?_了不起的厂长-CSDN博客_go gpm调度转载 2021-12-15 00:13:30 · 807 阅读 · 0 评论 -
垃圾回收-三色标记法
参考文档:Golang三色标记、混合写屏障GC模式图文全分析_混血王子的博客-CSDN博客_golang 三色标记法为什么堆会触发屏障,栈不会触发转载 2021-12-13 00:29:08 · 216 阅读 · 0 评论 -
对golang的Channel初始化的有缓存与无缓存解释
参考文章:对golang的Channel初始化的有缓存与无缓存解释 - Go语言中文网 - Golang中文社区这篇文章没看懂,简单说下就是channel初始化的时候,make了缓存长度的话,就是带缓存的,没有make长度,就是不带缓存的。带缓存的只要缓存没有满,往channel里面写东西和从channel里面读东西就都是异步的,不会被阻塞的。但是如果是不带缓存的,必须是发送的东西有人收到后才能继续下一次发送;或者是接受的东西必须收到后才能继续下一次的接受。func main() { jobs原创 2021-09-12 17:56:08 · 606 阅读 · 0 评论 -
golang struct、map、json相互转换
https://www.jb51.net/article/202488.htm原创 2021-05-21 16:28:24 · 139 阅读 · 0 评论 -
gomock
这个是go的标准mock工具,适合写单测使用https://studygolang.com/articles/16801https://blog.csdn.net/xiaoliizi/article/details/107736758https://www.jianshu.com/p/598a11bbdafbhttps://geektutu.com/post/quick-gomock.htmlhttps://www.jianshu.com/p/598a11bbdafb...原创 2021-02-07 20:08:56 · 152 阅读 · 0 评论 -
golang并发
文章:http://www.cppcns.com/jiaoben/golang/238714.html原创 2020-12-28 15:26:22 · 129 阅读 · 0 评论 -
go版本升级
https://studygolang.com/articles/14815?fr=sidebar原创 2020-12-24 14:15:58 · 356 阅读 · 0 评论 -
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义用其它字符替代吧,或用全角的。+ URL 中+号表示空格 %2B空格 URL中的空格可以用+号或者编码 %20/ 分隔目录和子目录 ...转载 2020-11-10 19:56:47 · 6298 阅读 · 0 评论 -
goland如何利用go fmt设置自动格式化代码写自定义目录标题
goland如何利用go fmt设置自动格式化代码写自定义目录标题设置方式设置方式https://jingyan.baidu.com/article/c45ad29c64cfe7051653e245.html转载 2020-11-10 19:54:18 · 569 阅读 · 0 评论 -
goland自动添加文件头
https://blog.csdn.net/qq_33875256/article/details/84974129转载 2020-03-10 14:52:20 · 700 阅读 · 0 评论 -
Go语言类型转换和类型断言
Go语言类型转换和类型断言Go语言的类型转换和类型断言:类型转换在编译期完成,包括强制转换和隐式转换 类型断言在运行时确定,包括安全类型断言和非安全类型断言 Go语言要求不同类型之间必须做显式的类型转换。但似乎涉及到接口类型时,就会有所不同。//两种类型断言//不安全的类型断言,如果系统检测到不匹配,会在运行时调用内置的panic,抛出异常s := "abc"i := s.(...原创 2019-10-29 10:46:38 · 307 阅读 · 0 评论