随笔分类 -  Go

上一页 1 2 3 4 5 下一页

优先队列(基于二叉树的堆)
摘要:代码出处 Go SDK container/heap/heap.go Interface 接口定义 type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interf 阅读全文

posted @ 2023-07-15 09:58 王景迁 阅读(18) 评论(0) 推荐(0)

go引用类型和值类型
摘要:引用类型引用类型有字典类型、通道类型、函数类型、切片类型、接口类型和指针类型。 值类型值类型有基础数据类型和结构体类型以及数组类型。 阅读全文

posted @ 2023-07-15 08:17 王景迁 阅读(22) 评论(0) 推荐(0)

go单元测试显示测试用例代码覆盖率
摘要:执行单个目录所有测试用例并生成覆盖率 go test -gcflags=all=-l -coverprofile=$GOPATH/bin/c.out . go tool cover -html=$GOPATH/bin/c.out -o=$GOPATH/bin/tag.html 下面场景相同go to 阅读全文

posted @ 2023-07-15 08:16 王景迁 阅读(140) 评论(0) 推荐(0)

interface{}
摘要:判断某个对象是否实现了某个接口 package main import "fmt" type Do interface { do() } type A struct{} func (a A) do() {} type B struct{} func main() { var do interface 阅读全文

posted @ 2023-07-15 08:13 王景迁 阅读(32) 评论(0) 推荐(0)

go目录结构和交叉编译
摘要:环境变量 GOROOT:GO语言的安装路径GOPATH:项目目录GOBIN:执行go install go文件时,生成可执行文件的路径,通常设置为GOPATH/bin。 GOPATH目录结构 GOPATH/src目录下放源代码文件。GOPATH/pkg目录下放执行go install 目录名后生成的 阅读全文

posted @ 2023-07-15 08:09 王景迁 阅读(194) 评论(0) 推荐(0)

GO协程
摘要:goroutine 协程本意是coroutine,go协程是goroutine。线程分为内核态线程(内核线程)和用户态线程(协程)。线程由CPU调度是抢占式的,协程由用户态调度是协作式的(主动让出才执行下一个)。 N:1(N个用户线程绑定1个内核线程) 例子:python的gevent优点:协程切换 阅读全文

posted @ 2023-07-15 07:26 王景迁 阅读(82) 评论(0) 推荐(0)

go垃圾回收
摘要:三色标记法 三色标记法配合写屏障和辅助GC。1.初始状态所有对象都是白色。2.从根出发扫描,将引用的对象标记为灰色。3.分析灰色对象是否引用了其他对象,自身标记为黑色,将它引用的其他对象标为灰色4.重复步骤3,直到灰色对象队列为空。此时白色对象即为垃圾,进行回收。 写屏障:每一轮GC开始时会初始化屏 阅读全文

posted @ 2023-07-15 07:19 王景迁 阅读(26) 评论(0) 推荐(0)

使用beego基本流程
摘要:安装beego和bee go get github.com/astaxie/beego go get github.com/beego/bee 自己的用户变量 -> Path -> 添加GOPATH路径\bin(bee.exe文件位置)确认bee命令全局可用:bee version 新建API项目并 阅读全文

posted @ 2023-07-15 07:15 王景迁 阅读(27) 评论(0) 推荐(0)

通过cond实现阻塞队列
摘要:多个协程等待某个条件满足Signal方法:唤醒等待队列中第1个等待者,相当于Java的notify方法 Broadcast方法:唤醒等待队列中所有等待者,相当于Java的notifyAll方法 Wait方法:阻塞自己,直到被唤醒 通过cond实现阻塞队列调用Wait方法前先加锁,Wait方法执行完成 阅读全文

posted @ 2023-06-09 18:03 王景迁 阅读(26) 评论(0) 推荐(0)

基于四叉树的小顶堆(最小优先队列)
摘要:实现来自Go源码 从下往上调整堆 func siftupTimer(t []*timer, i int) bool { if i >= len(t) { return false } when := t[i].when tmp := t[i] for i > 0 { // 除非到达堆顶,否则每次和当 阅读全文

posted @ 2023-02-19 19:50 王景迁 阅读(124) 评论(0) 推荐(0)

gomonkey不生效
摘要:gomonkey作用在运行时把原函数地址替换为目标函数地址。Mock接口时使用实现接口的结构体。 go.mod require github.com/agiledragon/gomonkey/v2 v2.3.0 a.go package main type A struct {} func (a A 阅读全文

posted @ 2023-02-04 20:50 王景迁 阅读(1815) 评论(0) 推荐(1)

go mod
摘要:创建go.mod 在当前目录下生成一个go.mod文件 go mod init xxx(目录名称) 使用go mod管理项目,不需要把项目放到GOPATH目录下,可以在任何位置新建一个项目。go.mod所在的目录为一个模块。编译运行项目后,项目目录下多出了一个文件go.sum。go.sum是记录所依 阅读全文

posted @ 2023-01-21 20:51 王景迁 阅读(209) 评论(0) 推荐(0)

go内存逃逸
摘要:逃逸分析 go在编译时确定是否逃逸,逃逸分析是编译器决定变量分配到栈上还是堆上的一种行为。 查看逃逸分析日志:go build -gcflags=-m其中,-m打印出逃逸分析的优化策略。 指针逃逸 函数局部变量优先分配到栈上。如果编译器不能确保变量在函数return之后不再被引用,那么编译器就会将变 阅读全文

posted @ 2023-01-21 20:40 王景迁 阅读(64) 评论(0) 推荐(0)

go检测命令
摘要:map并发读写场景未加锁 package main import "time" func main() { m := make(map[int]int) go func() { for i := 0; i < 10000; i++ { m[0] = 1 } }() go func() { for i 阅读全文

posted @ 2023-01-21 19:52 王景迁 阅读(24) 评论(0) 推荐(0)

go RWMutex源码分析
摘要:适用场景 并发场景下读多写少。 字段含义 RWMutex基于Mutex,写优先,Lock函数(反转readerCount)会阻止新的reader获取锁。 type RWMutex struct { w Mutex // writer之间互斥 writerSem uint32 // writer信号量 阅读全文

posted @ 2023-01-21 19:30 王景迁 阅读(74) 评论(0) 推荐(0)

go sync.Once源码分析
摘要:适用场景 服务启动时读取全局配置。单个函数流程里面只调用一次。 源码 双重检查done值是0后,加锁执行指定函数并把done值改成1。 type Once struct { done uint32 m Mutex } func (o *Once) Do(f func()) { if atomic.L 阅读全文

posted @ 2023-01-21 17:43 王景迁 阅读(40) 评论(0) 推荐(0)

go WaitGroup源码分析
摘要:适用场景 等待若干个任务执行完成。 实现原理 字段 type WaitGroup struct { 省略 // 存储waiter数、WaitGroup计数和信号量 state1 [3]uint32 } 添加任务Add函数 设置WaitGroup计数 func (wg *WaitGroup) Add( 阅读全文

posted @ 2023-01-21 16:20 王景迁 阅读(34) 评论(0) 推荐(0)

go Channel源码分析
摘要:理论基础 不要通过共享内存来通信,要通过通信来共享内存。 特点 通道分为非缓冲通道和缓冲通道。单向通道由双向通道转换而来,但是单向通道不能转换回双向通道。 通过make来初始化一个chan,未初始化的chan的零值是nil。 接收数据时,返回两个值。第一个值是返回的chan中的元素,第二个值是boo 阅读全文

posted @ 2023-01-21 09:59 王景迁 阅读(88) 评论(0) 推荐(0)

基于close channel广播机制来实现TimingWheel
摘要:基于1个Ticker+1个环形数组+多个channel,实现了多个任务在指定最大超时时间范围内的一次性超时通知机制。 代码 package main import ( "fmt" "sync" "time" ) type TimingWheel struct { sync.Mutex interva 阅读全文

posted @ 2022-11-20 20:33 王景迁 阅读(48) 评论(0) 推荐(0)

go Mutex源码分析
摘要:使用Mutex 互斥锁Mutex提供了两个函数Lock和Unlock。 func(m *Mutex) Lock() func(m *Mutex) Unlock() 源码分析 Mutex实现演变过程 初版 // 互斥锁的结构,包含两个字段 type Mutex struct { key int32 / 阅读全文

posted @ 2022-07-23 07:34 王景迁 阅读(108) 评论(0) 推荐(0)

上一页 1 2 3 4 5 下一页

导航