自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 golang CAS原子操作

原子操作,在多线程编程中是一个很常见的课题,指的是一个操作或一系列操作在被CPU调度的时候不可中断。早期的软件基本都是单核单线程,每个操作都可以视为原子操作,因此不会有并发问题,但随着现在多核多线程编程的出现,线程并发成为了多线程编程中不可回避的一个课题。 从硬件层面来实现原子操作,有两种方式: 1、总线加锁:因为CPU和其他硬件的通信都是通过总...

2019-07-31 17:19:43 5943 3

原创 Golang 空map和未初始化map注意事项

可以对未初始化的map进行取值,但取出来的东西是空:var m1 map[string]stringfmt.Println(m1["1"])不能对未初始化的map进行赋值,这样将会抛出一个异常:panic: assignment to entry in nil mapvar m1 map[string]stringm1["1"] = "1"通过fmt打印map时,空map和...

2019-03-29 15:45:29 13162

原创 Golang 使用reflect与Pointer获取传入的interface信息

使用反射可以获取到数据的类型信息,reflect.TypeOf()返回的数据类型如下:type rtype struct { size uintptr ptrdata uintptr // number of bytes in the type that can contain pointers hash uint32 // hash of type...

2019-03-28 16:39:41 2218

原创 Golang 使用unsafe.Pointer优化byte[]与String转换性能

我们知道一般来说对于一个String,如果想要转换为byte[]都是通过类型转换语法来实现的:Res := string(bytes)这种方式是Go所推荐的,优点就是安全,尽管这种操作会发生内存拷贝,导致性能上会有所损耗,这在处理一般业务时这种损耗是可以忽略的。但如果是拷贝频繁的情况下,想要进行性能优化时,就需要引入unsafe.Pointer了:func main() { v...

2019-03-27 12:47:46 4564 1

原创 Golang for-select因定义空default导致CPU占用达到100%

看下面这一段代码,这段代码执行时会把CPU撑到100%:func main() { var ch chan int for { select { case <-ch: return default: } }}我们知道对于select语句,每个case的IO事件都是阻塞的,监听IO事件是不会占用CPU至满的。造成CPU占用的原因是这个空default,...

2019-03-22 20:36:25 4423 2

原创 Golang 切片扩容

我们知道,如果我们在给一个切片append元素的时候,如果这个切片的容量(Cap)不够的时候,切片会自动进行扩容(这个扩容过程是通过拷贝实现的),但是如果我们想要在一个切片容量足够的时候对其进行扩容呢?那么可以通过以下代码进行实现,实现的原理也是拷贝:func main() { buf := make([]int, 0, 20) buf = append(buf, 1,2,3,4,5,6...

2019-03-21 15:00:56 1652

原创 Golang 实现简单线段树

用Go撸了个简单线段树练练手package mainimport "fmt"//线段树节点type Node struct { L int R int Left *Node Right *Node Cover int}//建树func (this *Node) build(l, r int) *Node { this.L = l this.R...

2019-03-20 15:54:12 651

转载 Golang Struct内存偏移

转载自:https://studygolang.com/articles/13364?fr=sidebarhttps://www.cnblogs.com/wdliu/p/9209419.html在我们定义Struct时,如果我们书写StructField的顺序不同,可能会造成申请到的内存空间不同的情况,主要原因时:struct内的field内存分配是以4B为基础的,超过4B时必须...

2019-03-19 16:05:01 892

转载 Golang for range关于切片的语法糖

转载自:https://blog.cyeam.com/golang/2018/10/30/for-interals有以下代码:func main() { v := []int{1, 2, 3} for i := range v { v = append(v, i) }}这个代码会遍历v的切片,在遍历的过程中append元素给切片,那么它会不会死循环呢?答案是否定的,一...

2019-03-19 15:57:00 2327

原创 Go字符串修改

Go中字符串本身是不可修改的,只有转成数组后才能修改:OldStr := "abcd"NewStr := []byte(OldStr)NewStr[0] = 'A'fmt.Println(string(NewStr))但这其实是将string复制了一份到切片,然后对切片进行修改,最后再把切片转换为string输出,这个过程发生了2次内存复制,第一次是把字符串复制给切片,第二次是把切...

2019-03-07 15:44:51 1364

原创 Golang 二叉平衡树

简单地撸了个AVL树练练手package mainimport "fmt"type AVLNode struct { left *AVLNode right *AVLNode hight int data int}func (this *AVLNode)FindMaxData() int { if this == nil { return 0 } if th...

2019-03-07 10:22:40 134

原创 Golang unsafe.Sizeof小结

unsafe.Sizeof返回的是类型数据结构的大小而不是其指向内容的数据大小,如: slice := []int{1,2,3,4,5,6,7,8,9,10} fmt.Println(unsafe.Sizeof(slice)) //24使用 spew.Dump(*(*reflect.SliceHeader)(unsafe.Pointer(&amp;slice))) ,我们可以打印出该切...

2019-03-04 16:58:09 1226

转载 Golang线程安全Map:sync.Map使用小结

转载自:https://blog.csdn.net/u010230794/article/details/82143179https://www.jianshu.com/p/10a998089486sync.Map的使用:package mainimport ( "sync" "fmt")func main() { //开箱即用 var sm sync.Map ...

2019-03-04 11:13:23 7139

转载 Golang锁

转载自:https://www.jianshu.com/p/a1d62b6a13acGo 语言提供两类锁: 互斥锁(Mutex)和读写锁(RWMutex)。其中读写锁(RWMutex)是基于互斥锁(Mutex)实现的,互斥锁的定义如下:type Mutex struct { state int32 sema uint32}互斥锁提供两个API,Lock和Unlock,按字面意...

2019-03-01 16:21:58 753

转载 Golang使用Sort包排序小结

转载自:https://segmentfault.com/a/1190000008062661https://www.jianshu.com/p/6cdbba0e30b5Go的sort包提供了封装好的排序方法对基础类型排序可以调用sort.Ints(IntList)、sort.Float64s(FloatList)、sort.Strings(StringList)等方法,默认...

2019-03-01 15:45:05 1267

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除