-
go module的使用非常简单
初始化go.mod
go mod init
整理依赖包
go mod tidy
如果想缓存到vendor目录
go mod vendor
执行命令之后都会自动把依赖搞定.
但是, 如果我们是本地开发的包, 还没有远程仓库
-
程序运行前加载
1.导包前面加下划线,运行前加载
2.把要加载的写在init函数里面
路由设置
路由的作用:根据不同的请求指定不同的控制器
路由函数:
beego.Router("/path",&controller.MainCon
-
介绍
反射的本质就是在程序运行的时候,获取对象的类型信息和内存结构,反射是把双刃剑,功能强大但可读性差,反射代码无法在编译阶段静态发现错误,反射的代码常常比正常代码效率低1~
-
grpool的作用就是复用goroutine,减少频繁创建销毁的性能消耗。
名词概念
Pool: goroutine池,用于管理若干可复用的goroutine协程资源
Worker: 池对象中参与任务执行的goroutine,一个worker可以执行若干个
-
近年来,Uber已经开始采用Golang(简称Go)作为开发微服务的主要编程语言。目前,其Go monorepo(译者注:包含多个不同项目的单个仓库)包含了大约5,000万行代码,以及大约2,100个独特的Go服务。
-
TCP层流量整形是在字节流收发时按指定速率限制吞吐量,不依赖协议解析,通过rate.Limiter包装net.Conn的Read/Write实现双向限速,适用于Redis、PostgreSQL等非HTTP协议转发。
-
在Go中对结构体切片递归遍历并追加元素时,若直接对range循环变量取地址传入递归函数,会导致所有指针指向同一内存地址,造成数据污染和结果异常。
-
r.FormValue()是唯一可靠方法:它自动判断编码类型,multipart时调用ParseMultipartForm,普通表单时用ParseForm;r.PostFormValue()在multipart下总为空,因其只查未解析的空r.PostForm。
-
Go中指针数组即[]T切片,需用make([]int,3)声明并显式初始化各元素,不可直接取切片元素地址以防悬垂指针;其内存开销通常大于值数组,仅在大结构体且需共享或部分修改时才有优势。
-
本地队列优先被使用,因其是每个P独有、无锁的FIFO队列,存取零同步开销且缓存友好;满256时触发半队列迁移至全局队列以实现负载均衡;全局队列仅在本地空、窃取失败、系统调用返回或GC后等特定路径下才被访问。
-
通过reflect包可获取函数或方法的参数个数、类型及变参信息:先用reflect.TypeOf(函数)或reflect.ValueOf(实例).MethodByName("方法名").Type()得到类型对象,再调用NumIn()、In(i)和IsVariadic()解析参数结构,注意方法需导出且无法获取参数名。
-
Go语言允许编译器和处理器在单个goroutine内对无依赖的内存写入操作进行重排序,只要不改变该goroutine内部的语义;但若缺乏显式同步(如channel、mutex、atomic或sync.WaitGroup),其他goroutine可能观察到违反代码顺序的值更新。
-
channel阻塞和死锁源于生命周期、缓冲机制及协作逻辑理解偏差;发送与接收须成对且至少一方不阻塞;死锁是所有goroutine在channel操作上永久等待的确定状态;select+default可实现非阻塞操作。
-
应先调用FieldByName再检查IsValid()判断字段是否存在,因未导出或不存在的字段均返回无效值;FieldByName大小写敏感且仅支持导出字段,嵌套匿名字段需手动遍历。
-
测试数据工厂不能直接newstruct,因其导致字段硬编码、耦合难维护;应通过函数式选项模式封装默认值与灵活覆盖,隔离变化、确保可重入,并用延迟构建解耦关联结构。