随笔分类 - golang
摘要:用途 用于遍历切片,数组,字符串, map, chan。在遍历完所有元素或通道关闭后,会自动退出循环,可以主动break退出。 用法示例 for index,value := range slice { // ... } for key,value := range map { // ... } f
阅读全文
摘要:golang并未对值溢出做定义,采用值"回绕"的方式自动处理。 比如uint8的取值范围是0~255。如果将溢出到-1时,会回绕到255;如果将溢出到256时,会回绕到0。 值溢出不会报错和终止程序,但是运算结果应完全不是预期的,需要特别注意。
阅读全文
摘要:正常模式 锁竞争不激烈时的模式。 goroutine在需要获取锁时,会先自旋尝试获取锁,通常尝试4次,自旋结束后还没获取到锁,就进入等待队列。如果goroutine等待时间超过1ms,锁会切换为饥饿模式。 饥饿模式 锁竞争激烈时的模式。 goroutine在需要获取锁时,不自旋,而是直接进入等待队列
阅读全文
摘要:超时 当goroutine运行时间超过10ms,调度器会尝试抢占该goroutine,使其让出cpu资源。 触发系统调用 当goroutine执行系统调用时,调度器能够感知并切换goroutine. 系统调用包括:文件io,网络io,时间睡眠,内存管理,线程管理等,可以理解为goroutine发生阻
阅读全文
摘要:架构 三层架构 - mcache: 逻辑处理器(P)私有缓存,用于快速分配小对象。 - mcentral: 所有逻辑处理器(P)共享的中央缓存,为mcache提供内存。 - mheap: 程序全局堆,整个程序共享的一片虚拟地址空间。 内存分配 分配单位: - mspan: 真正存储对象的内存块。 内
阅读全文
摘要:new new总是返回指定类型的指针 new仅能做零值初始化,不涉及引用类型底层数据的初始化 new可以用于所有类型数据的创建 make make直接返回指定类型 make会自动处理引用类型底层数据的初始化 make只能用于初始化切片(slice),映射(map),通道(chan)
阅读全文
摘要:安装 go get github.com/go-playground/validator/v10 基础示例 package main import ( "fmt" "github.com/go-playground/validator/v10" ) type User struct { Name s
阅读全文
摘要:回收算法 (golang < 1.25 , 1.25+ 引入了green tea算法) 三色标记-清除算法 回收过程 触发GC后,将全部对象标记为白色。 第一阶段,短暂暂停程序,将根对象(全局对象,协程栈等)标记为灰色,同时开启写屏障。 第二阶段,恢复程序运行,并发地继续标记工作,这个阶段用户程序与
阅读全文
摘要:切片(slice) 本质:结构体 内容: - 指向数组头地址的指针(即数组首个元素的内存地址)。 - 长度,存放元素数量。 - 容量,底层数组的长度。 数据结构:数组 映射(map) 本质:结构体 内容: - 键值对数量 - 桶数组长度以2为底数的对数 - 指向当前使用桶数组的指针 - 指向旧桶数组
阅读全文
摘要:func worker(highPriority, lowPriority <-chan int, stopCh chan struct{}) { for { select { case <-stopCh: return case job := <-highPriority: // 优先处理高优先级
阅读全文
摘要:1.单字段校验函数示例 func singleFieldValidator(fl validator.FieldLevel) bool { // 利用反射的方法,取出字段值,这里假设字段值是string类型 value := fl.Field().String() // 接下来就是校验字段值,返回t
阅读全文
摘要:package main import ( "context" "encoding/json" "fmt" "log" "time" "github.com/olivere/elastic/v7" ) // 定义一个员工结构体 type Employee struct { Firstname str
阅读全文
摘要:package main import ( "fmt" "reflect" ) type User struct { Name string `bson:"name" json:"name" binding:"name"` } func main() { var u User typ := refl
阅读全文
摘要:func main() { gin.SetMode(gin.ReleaseMode) // 必须:关闭调试日志和优化性能 r := gin.New() // 不包含Logger r.Use(gin.Recovery()) // 按需添加Recovery r.GET("/", func(c *gin.
阅读全文
摘要:参考示例: // getValidatorErrMsg 获得友好的validator错误信息 func getValidatorErrMsg(fieldErr validator.FieldError) string { switch fieldErr.Tag() { case "required"
阅读全文
摘要:前置源码 // gin context处理func (engine *Engine) HandleContext(c *Context) { oldIndexValue := c.index c.reset() engine.handleHTTPRequest(c) c.index = oldIn
阅读全文
摘要:1.go参数/变量传递是值传递,会发生拷贝,包括在传递指针时,也会发生指针的拷贝.2.值的"方法集"会被其指针继承.3.值调用指针接收方法时,方法会获得指针的副本,修改会改变原值; 指针调用值接收方法时,方法会获得值副本,修改不会改变原值.(实际上,分别发生了"由值找指针"和"由指针找值"的过程,由
阅读全文
摘要:1.随机整数 // GetRandomInt 随机获得一个在一定范围内的整数,范围[mi,mx) func GetRandomInt(mi int, mx int) (int, error) { if mi >= mx { return 0, errors.New("输入的整数范围有误") } //
阅读全文
摘要:1.解释 发生这种情况,是因直接或者间接依赖的第三方库,所要求的golang版本高于本地版本. 可以看看下面的这个文档, 里面对当前go mod工具链做了描述: https://golang.ac.cn/doc/toolchain 大致意思是: go 1.21之后, mod文件中, "go"指令指的
阅读全文
摘要:绑定url路径参数 // 使用uri标签// 举例:type UserParams struct { ID string `uri:"id" binding:"required"` // 绑定路径参数 Name string `uri:"name"` // 可选参数} 绑定url查询参数 // 使用
阅读全文
浙公网安备 33010602011771号