随笔分类 - Go
golang the future lang
摘要:1.用Mutex实现 package main import ( "fmt" "sync" ) var num int var mtx sync.Mutex var wg sync.WaitGroup func add() { mtx.Lock() defer mtx.Unlock() defer
阅读全文
摘要:Gin框架特点:轻量级、高性能(使用httprouter)、中文文档齐全、简单易用。 Gin框架安装与使用 安装 下载并安装Gin: go get -u github.com/gin-gonic/gin 第一个Gin示例: package main import ( "github.com/gin-
阅读全文
摘要:ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)
阅读全文
摘要:Slice 切片即动态数组,可以动态扩容改变数组的容量. golang 的 slice 底层结构如下所示,它是一个结构体,里面包含了指向数组的地址,并通过 len、cap 保存数组的元素数、容量: type slice struct { array unsafe.Pointer // 指向数组的指针
阅读全文
摘要:Golang的读写锁的实现 结构体 type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // 用于writer等待读完成排队的信号量 readerSem uint32 // 用于rea
阅读全文
摘要:将 value 强制转换为已知类型 我们可以通过 ValueOf 拿到了内存中实际的值,从原理上来说,只要通过强制类型转换,就可以将他转换为我们需要的类型了 转换为基本类型 Value 类型绑定了以下几种基本类型的转换方法: func (v Value) Bool() bool func (v Va
阅读全文
摘要:1、golang中反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal) 例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。
阅读全文
摘要:1.golang默认都是采用值传递,即拷贝传递 2.有些值天生就是指针,如slice、map、channel、function、pointer,即指针传递
阅读全文
摘要:下载文件时暂停后可以继续接着下载,在线看视频时可以随意拖动进度条,这些都是断点续传所实现的应用。http1.1支持Range属性从而实现断点续传,客户端在暂停时记录了已经下载的文件范围,当继续下载时就向服务器发送文件剩余的范围Range,服务器则根据客户端请求的范围Range返回相应文件的部分数据,
阅读全文
摘要:1.手动终止 调用 runtime.Goexit() 来手动终止协程 goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。 2.1 使用for-range退
阅读全文
摘要:1.channel+sync 2 ⽆缓冲channel和任务发送/执⾏分离来限制(协程池)
阅读全文
摘要:channel主要用于解决go程的同步问题以及协程之间数据共享问题。 goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine奉行通过通信来共享内存,而不是共享内存来通信。
阅读全文
摘要:tx对象 tx, err := db.Begin() tx.Exec(query1) tx.Exec(query2) tx.commit() 一般查询使用的是db对象的方法,事务则是使用另外一个对象。 使用db的Begin方法可以创建tx对象。tx对象也有数据库交互的Query,Exec和Prepa
阅读全文
摘要:Gin封装的最好的地方就是context和对response的处理。本篇文章主要解释context的使用方法, 以及其设计原理 将Request的处理封装到Context中优点 在阅读gin的源码时, 请求的处理是使用type HandlerFunc func(*Context)来处理的. 也就是
阅读全文
摘要:Gin的是路由算法其实就是一个Trie树(也就是前缀树)。 注册路由预处理 我们在使用gin时通过下面的代码注册路由 普通注册 router.POST("/somePost", func(context *gin.Context) { context.String(http.StatusOK, "s
阅读全文
摘要:变量间的赋值(值拷贝) a:=1 b:=a fmt.Println(b,&a,&b) 方法调用 值拷贝: 1 array golang中以array作为参数的方法调用,方法接收的是整个array的值拷贝,所以方法中对array的item重新赋值不起作用。 如以下代码所示,输出为[1, 2, 3]。
阅读全文
摘要:2.slice底层数据结构与使用注意事项 3.map底层数据结构与注意事项 5.锁的底层实现
阅读全文
摘要:反射机制是现代编程语言中一个比较高级的特性 在编译时不知道类型的情况下,通过反射机制可以获取对象的类型、值、方法甚至动态改变对象的成员,这就是反射机制 反射的意思是在运行时,能够动态知道给定数据对象的类型和结构,并有机会修改它! 现在一个数据对象,如何判断它是什么结构?数据interface中保存有
阅读全文
摘要:1.单例模式 package singleton import "sync" //Singleton 是单例模式类 type Singleton struct{} var singleton *Singleton var once sync.Once //GetInstance 用于获取单例模式对象
阅读全文
摘要:在Gin的整个实现中,中间件可谓是Gin的精髓。一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且中间件之间相互不用感知到,每个中间件只需要处理自己需要处理的事情即可。 Gin中常用的中间件是: Logger 日志 Recovery panic 处
阅读全文