-
gofmt和goimports需串联使用:先gofmt统一格式,再goimports-w自动管理导入;VSCode中应设"go.formatTool":"goimports"避免重复触发。
-
Viper加载配置后Validator不生效的根本原因是未在结构体字段添加validate标签,且Viper默认仅做字段映射而不触发射频校验;必须显式添加如validate:"required,gte=1024"等标签,并配合mapstructure标签确保正确赋值。
-
在Golang中,通过反射修改变量值需确保其可寻址且可写。1.必须传入指针并调用Elem()获取实际值;2.使用CanSet()判断是否可修改,防止操作不可变值;3.修改基础类型需使用对应Set方法如SetInt()、SetString();4.修改结构体字段时,字段必须导出(首字母大写);5.常见错误包括未用指针、漏掉Elem()、修改非导出字段或类型不匹配。掌握这些要点可有效避免踩坑。
-
mgo库不会缓存传入mgo.Dial()的连接字符串;所谓“连接旧库”实为代码中其他位置(如session.DB())硬编码了旧数据库名,而非连接字符串被缓存或复用。
-
Go语言time包核心功能包括获取当前时间(time.Now)、按“MonJan215:04:05MST2006”格式化、解析字符串(time.Parse/ParseInLocation)、时间计算(Add/Sub/AddDate)与比较(Before/After/Equal)、提取时间字段及定时操作(Sleep/Ticker)。
-
panic是Go中表示程序无法继续执行的机制,可由运行时错误自动触发或手动调用panic()引发;2.常见自动触发场景包括空指针解引用、数组或切片越界、整数除以零及向已关闭channel发送数据。
-
结构体值复制时,切片和map字段共享底层数据,仅复制引用;修改元素会影响对方,append可能触发扩容导致分离;map修改则双方均可见;需手动深拷贝实现完全独立。
-
SearchRepositories不返回StargazersCount,需用Repositories.Get单独获取;未认证请求限速60次/小时且结果不全,建议用带Token的NewRateLimitWaitClient并控制并发。
-
pkg.go.dev是Go官方推荐的模块文档托管服务,自动为公开Git仓库中满足module路径一致、符合注释规范、打有语义化版本tag等条件的Go模块生成结构化文档。
-
Go语言虽无传统C/C++的静态/动态库概念,但可通过模块化包管理、远程仓库引用及GoModules机制,将共享逻辑(如mailer)抽离为独立可复用包,统一维护、版本化分发,并在多个项目中安全导入。
-
安装Go扩展并配置环境变量和gopls语言服务器,再安装Delve调试工具,即可在VSCode中实现代码补全、跳转、格式化和调试功能。
-
Go中type关键字定义新类型(如typeMyIntint)而非别名,必须显式转换;typeMyInt=int才是真别名。新类型可绑定方法、实现接口,结构体嵌入实现组合而非继承。
-
Go中树节点必须用*Node而非Node定义子节点,否则值类型复制会导致父节点引用失效、树结构断裂;所有修改操作需指针传递,且Insert等方法首行须判空,避免nil解引用panic。
-
Go无传统构造函数,惯用NewXxx()函数初始化对象;返回指针而非值类型,主要出于方法调用链支持、地址可达性保障(如map元素)、内存效率及语义清晰性等工程考量。
-
Go不支持将单向通道(如chan<-[]byte或<-chan[]byte)强制转换为双向通道chan[]byte,也无法定义不绑定元素类型的“泛型通道”;正确做法是重构函数签名,使其直接接受任意方向的只读通道并使用len()安全获取长度。