随笔分类 - golang
摘要:1. 数据争用 数据争用在golang中指两个协程同时访问相同的内存空间,并且至少有一个是写操作,就是线程不安全的问题 在golang中有一种经典的数据争用错误 func save(g *data){ saveToRedis(g) } func main(){ var a map [int]data
阅读全文
摘要:golang中的defer可以给我们编程带来很大的遍历,一些操作可以使用defer来防止不及时的关闭等 比如互斥锁、文件句柄、数据库连接等 比如一个文件操作: func main() { file, err := os.Open( "test.txt" ) if err != nil { log.P
阅读全文
摘要:1. 自定义response 对于具体的项目而言,我们需要基于JSON()自定义一个方便好用的response 比如下面这种形式: type Response struct { StatusCode int `json:"status_code" ` // 业务状态码 Message string
阅读全文
摘要:在golang中,select一般是和chan一起工作的,用于同时监听多个chan的信息,其实用方法和switch差不多: select { case <-ch1: // ... case x := <-ch2: // ... case ch3 <- y: // ... default : // .
阅读全文
摘要:首先需要导入依赖 go get gopkg.in/amz.v1/aws go get gopkg.in/amz.v1/s3 1. 初始化ceph连接 在初始化连接之前,我们需要创建一个用户得到accessKey和secretKey,新增用户的指令如下: docker exec ceph-rgw ra
阅读全文
摘要:1. Token-based Authentication 在这种验证机制中,用户第一次登录需要POST自己的用户名和密码,在服务器端检验用户名和密码正确之后,就可以签署一个令牌,并将其返回给客户端 在此之后,客户端就可以用这个access_token来访问服务器上的资源,服务器只会验证该令牌是否有
阅读全文
摘要:1. 路由组 在实际的项目开发中,均是模块化开发 同一模块内的功能接口,往往会有相同的接口前缀,这种可以用路由组来进行分类处理。 比如下面这几组接口: 注册:http: //localhost:8080/user/register 登陆:http: //localhost:8080/user/log
阅读全文
摘要:1. 实体绑定 以一个用户注册功能来进行表单实体绑定操作 用户注册需要提交表单数据,假设注册时表单数据包含三项: username phone password 我们创建一个UserRegister结构体用于接收表单数据,通过tag标签的方式设置每个字段对应的form表单中的属性名,通过bindin
阅读全文
摘要:1. hello world 首先拉取gin开发框架 go get -u github.com /gin-gonic/gin 我们从入门的hello world入手看起gin是如何构建一个http服务器的 package main import "github.com/gin-gonic/gin"
阅读全文
摘要:go在线程的基础上实现了用户态更加轻量级的写成,线程栈为了防止stack overflow,默认大小一般是2MB,而在go中,协程栈在初始化时是2KB go中的栈是可以扩容的,在64位操作系统上最大为1GB 1. newstack()函数 在函数序言阶段如果判断出需要扩容,则会跳转调用运行时more
阅读全文
摘要:1. 切片的结构 一个切片在运行时由指针、长度和容量三部分构成 指针指向切片元素对应的底层数组元素的地址;长度对应切片中元素的数目,长度不能超过容量;容量一般是从切片的开始位置到底层数组的结尾位置的长度 2. 切片的底层原理 在编译时构建抽象语法树阶段会将切片构建为如下类型: type Slice
阅读全文
摘要:1. 什么是httprouter 较为流行的go web框架大多使用httprouter,或者是基于httprouter的变种对路由进行支持。 httprouter使用的是显式匹配,所以在路由设计的时候会存在一些路由冲突的问题: GET /user/info/:name GET /user/:id
阅读全文
摘要:转载:https://zhuanlan.zhihu.com/p/27917262 以一个简单的channel应用开始,使用goroutine和channel实现一个任务队列,并行处理多个任务。 func main(){ //带缓冲的channel ch := make( chan Task, 3)
阅读全文
摘要:1. GMP模型 G:goroutine M:thread线程 P:processor处理器 在go中,线程是运行goroutine的实体,调度器的功能是把可运行的goroutine分配到工作线程上。 全局队列:存放等待运行的G P的本地队列:和全局队列类似,存放的也是等待运行的G,但是数量有限,不
阅读全文
摘要:1. 什么是sqlc? google sqlc doc可以看到sqlc官网对于自己的定位,其主要作用就是从SQL生成可直接调用的go接口 我们使用sqlc可以简单分为以下三个步骤: 写SQL run sqlc生成我们所需要的go查询接口 使用这些接口与数据库交互 sqlc doc:https://d
阅读全文
摘要:1. redis分布式锁原理 redis实现分布式锁其实就是对key进行操作 加锁:给对应的lockkey赋值,就进行了加锁操作,其他进程发现该lockkey已经值了有值了,就说明锁已经被别人获取 解锁:获取到锁的进程删除这个lockkey 锁超时:避免客户端宕机导致无法正常释放锁 1.1 加锁 加
阅读全文
摘要:1. 上下文context 上下文context.Context在golang中用于设置截止日期、同步信号、传递请求相关值的结构体。 上下文概念和goroutine有着较为密切的关系,是go中独有的设计。 在goroutine构成的树形结构中对信号进行同步以减少计算资源的浪费是context最大的作
阅读全文
摘要:1. golang垃圾回收 golang的垃圾回收算法是三色标记法,其中三个颜色分别为:灰色、黑色、白色,其对应了垃圾回收过程中变量的三种状态: 灰色:对象还在标记队列中等待 黑色:对象已经被标记,该对象不会在本次GC中被回收 白色:对象为被标记,该对象会在本地GC中被回收 1.1 垃圾回收流程 假
阅读全文
摘要:尝试基于grpc和docker pubsub包,提供一个跨网络的发布和订阅系统 安装依赖: go get github.com/moby/moby/pkg/pubsub 首先通过proto定义一个发布和订阅服务接口: syntax="proto3"; package pb; option go_pa
阅读全文
摘要:1. 什么是gRPC gRPC是谷歌公司基于protobuf开发的跨语言的开源RPC框架,基于http/2协议设计,对移动设备更加友好。 go语言gRPC技术栈最底层为TCP或者Unix套接字协议,在此之上是http/2协议的实现,然后在http/2协议之上有构建了针对go语言的gRPC核心库。应用
阅读全文