随笔分类 - go
golang相关
摘要:一、参数校验问题 使用go做web服务时,经常需要对请求参数进行校验,有些必填参数需要校验是否为空。 经常会遇到参数a为int类型,但是其值取值范围为0-xxx。0也是有意义的。 即参数a如果传0也算传参了,但是go中传0会被认为是没有传,无法通过校验,导致出现问题。 目前的解决方法是将请求参数类型
阅读全文
摘要:很多项目都需要多个服务配合相互调用,所以请求经常需要有一个traceId来记录和追踪每个请求。 下面介绍下怎么在logrus中添加traceId 其实使用的是logrus的hook钩子 type TraceIdHook struct { TraceId string } func NewTraceI
阅读全文
摘要:for和range Go 语言中的经典循环在编译器看来是一个 OFOR 类型的节点,这个节点由以下四个部分组成: 初始化循环的 Ninit; 循环的中止条件 Left; 循环体结束时执行的 Right; 循环体 NBody: for Ninit; Left; Right { NBody } 分析遍历
阅读全文
摘要:函数调用 传值:函数调用时会对参数进行拷贝,被调用方和调用方两者持有不相关的两份数据; 传引用:函数调用时会传递参数的指针,被调用方和调用方两者持有相同的数据,任意一方做出的修改都会影响另一方。 Go 语言选择了传值的方式,无论是传递基本类型、结构体还是指针,都会对传递的参数进行拷贝 通过堆栈传递参
阅读全文
摘要:数组 Go 语言中数组在初始化之后大小就无法改变,存储元素类型相同、但是大小不同的数组类型在 Go 语言看来也是完全不同的,只有两个条件都相同才是同一个类型。 func NewArray(elem *Type, bound int64) *Type { if bound < 0 { Fatalf("
阅读全文
摘要:一、数据结构1、数组 类型 长度(不重要)初始化使用NewArray...是语法糖,编译器会自动推导,遍历元素来计算元素数量如果数组元素小于等于4个,所有变量会在栈上初始化,如果大于4个,变量会在静态存储区初始化然后拷贝到栈上。索引为非整数,负数,越界都会在编译期间pannic2、切片 数组指针 长
阅读全文
摘要:go设计与实现把go内存分配器介绍的很详细,起始一般情况下程序员不怎么会用到。需要简单了解下即可。如果没时间看,看看下述内容即可。 栈区堆区概念要理解。分配方法其实就是基于算法中的数组和链表,优缺点都类似。 go采用的空闲链表分配。并采取了隔离适应来规避链表的缺陷。 通过将对象大小分成微对象[<16
阅读全文
摘要:转载一篇仔细分析了golang的垃圾回收策略以及发展的一篇文章 地址是https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA%3D%3D&mid=2653355075&idx=4&sn=4e1e21682782c3b5345f344986ce8165&chks
阅读全文
摘要:goroutine是go中最重要的功能之一,正是因为有了goroutine这样强大的工具,go在并发方面表现的特别优秀。 那么goroutine和普通的线程和协程有什么区别呢?首先,我们需要明白线程和协程的区别,线程是内核态的,而协程是用户态的。什么意思呢?就是说线程之间的切换主要由内核去调度,而协
阅读全文
摘要:3.4 defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式: 如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。 不过如果对defer的了解不够深入,使用起来可能会踩到一些坑,尤其是跟带
阅读全文
摘要:将派生类的方法声明为接口嵌入到基结构体中,派生结构体声明该接口为自身。
阅读全文