golang
文章平均质量分 66
一只放羊的
这个作者很懒,什么都没留下…
展开
-
golang调优日记
2021/1/6服务在空载环境下要求 cpu均值基线为0.25,但实际却达到了0.28所以需要优化。准备步骤1.在代码中嵌入pprof服务端并将服务重新发布到服务器import _"net/http/pprof"func main(){ go func(){ err:=http.ListenAndServe("localhost:6060",nil) if err!=nil{ lager.Logger.Infof("pprof error") } }() /*原创 2021-01-06 20:26:57 · 127 阅读 · 0 评论 -
golang对slice的一些优化的操作
对slice高效的过滤利用slice的特性,我们在过滤并删除slice的数据不必要在重新make一个新的slice因为这样会重新创建数组浪费空间。所以最好借用原来的slice在原来的slice基础上创建slice,这样在删除时底层不会重新创建数组。func Filter(s []byte, fn func(x byte) bool) []byte { b:=s[:0] //我们利用传过来的slice重新创建一个slice,底层不会重新创建数组 for _, x := range s { if !原创 2020-07-13 16:50:21 · 751 阅读 · 0 评论 -
go之临时对象池Pool
简介临时对象池在go中对应sync.Pool类型,我们可以把sync.Pool当作存放临时值的容器,此容器是自动伸缩的、高效、线程安全的。从临时对象池获取对象有两个途径,第一个是Get向池中Put对象,另一个是通过对Pool的公开字段New赋值一个类型为func() interface{}的方法,通过调用该方法获取到的值,该方法是默认调用的,当Pool中没有Put任何对象时,如果你设置了New字段,那么Get到的值就是调用New获取到的值。注意如果你Get到的对象是Put到Pool中的那么Get完之后就原创 2020-05-18 14:11:14 · 363 阅读 · 0 评论 -
go-原子操作
atomic包atmoic包可以对int32、int64、uint32、uint64、uintptr、unsafe.Pointer提供五种原子性操作分别是增或减、比较并交换、载入、存储和交换。原子增或减简介atomic包中有类似AddInt32等这样的方法,它需要两个参数,第一个是需要修改的int32类型的变量地址,第二个是add到该变量上且与改变量类型相同的值。例子我们的例子是用10个线程每个线程都将变量value(初始值为0)增加1000次,那么最终结果是10000。不用原子操作的话我们可以原创 2020-05-18 13:22:46 · 600 阅读 · 0 评论 -
go 信号量之cond
cond有三个方法,分别是waite、Signal、Broadcast,wait方法会阻塞该方法所在的线程,Signal会唤醒最先因wait方法而阻塞的线程,Broadcast则会唤醒所有因wait方法阻塞的线程。定义一个condvar mutex=&sync.Mutex{}var cond=sync.NewCond(mutex)cond中有一个成员变量L,它就是你传入的mutex,上面两行代码即可把cond和你要用的锁关联起来,在使用你创建的锁只需要cond.L即可获取到。举一个生产和消原创 2020-05-17 15:58:12 · 446 阅读 · 0 评论 -
golang-锁的介绍和使用
互斥锁应用场景当多个groutine操作同一个线程不安全的公共资源时,为了安全我们使用互斥锁使得在某一时刻只有一个groutine操作该公共资源,即当有groutine在操作该共享变量(把共享变量加载到工作区,然后修改后再写入内存)时,其他线程在操作该共享变量时就会被block。应用案例我们对一个变量value=0进行1001000次+1的操作,我们知道正确答案应该是value=1001000=100000当不使用互斥锁时var wg *sync.WaitGroup=new(sync.WaitG原创 2020-05-16 11:22:34 · 646 阅读 · 0 评论 -
go之定时器
创建定时器func main(){ //前两句也可以用expirationTime:=time.After(time.Second*2)来代替 timer:=time.NewTimer(time.Second*2)//定时2秒 expirationTime:=<-timer.C//执行到此处会阻塞2秒 if timer.stop==false{//当定时器过时,就会返回false fmt.Println("stoped! ") }}使用sel原创 2020-05-11 18:23:07 · 123 阅读 · 0 评论 -
channel小知识点
1.传入channel的值是原来值的备份,从channel中取出来的值也是通道中值的备份。2.如果想通过channel传送同一个值,那么可以传递这个值的指针3.关闭channel要从发送端关闭,如果从接收端关闭会引发恐慌。4.发送端关闭通道并不会影响接收端接收5.带缓冲区和不带缓冲区的channel区别就是长度是否为0,不带缓冲区的channel长度就是06.操作未被初始化的通道会被永久阻塞var demo chan int//for会被永久阻塞for i:=range demo{}7.原创 2020-05-10 19:02:37 · 31034 阅读 · 0 评论 -
beego:unexpected end of JSON input
后台接收前台传过来的json,使用struct去接收报unexpected end of JSON input,我仔细对过struct每个字段中的属性和json配置都没错,我还试着把数据解析到map中还是同样的问题。最后百度后才知道要在app.conf中加入copyrequestbody = true才行。...原创 2020-04-30 15:13:46 · 1951 阅读 · 0 评论 -
go方法传参时指针类型和非指针类型的区别
如果函数接收的是非指针类型的参数,那么函数接收的一定是传入数据的拷贝(任何类型都是如此)。如果接收的是指针类型的参数,则传入的是原类型的地址,传入后在函数内部修改可以修改到原类型数据。例如type student struct{ age int name string}func main() { stu:=student{ name:"小明", ...原创 2020-03-08 20:15:37 · 1223 阅读 · 0 评论 -
go指针接收器和非指针接收器
1.二者的书写方式不同type student struct { age int8 name string}//指针接收器func(s *student) ageAdd1(){ s.age+=1}//非指针接收器func(s student) ageAdd2(){ s.age+=1}2.二者传入方法中的对象不同指针接收器传入的是struct本身,非指针接...原创 2020-03-06 12:25:48 · 1771 阅读 · 0 评论 -
golang channel带缓冲区和不带缓冲区的区别
1.声明方式不同带缓冲区: ch:=make(chan int,num) (num指的是你缓冲区的大小)不带缓冲区: ch:=make(chan int)2.运行方式不同不带缓冲区func main() { ch:=make(chan int) go func(){ time.Sleep(time.Second*3) <-ch }()...原创 2020-03-03 13:32:13 · 4145 阅读 · 0 评论 -
http请求之content-type
今天我在用go发送json数据时,客户端收不到,发送代码如下func HttpSender(url string,data io.Reader,method string){ transport:=http.Transport{ DisableKeepAlives:true, } client:=http.Client{ Transport:&t...原创 2020-01-08 17:07:42 · 148 阅读 · 0 评论