-
在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)。
-
用runtime.NumGoroutine()可快速检测协程泄漏:操作前后采样对比,差值超2~3需警惕;建议采样3次取最小值作基线,或配合donechan或time.AfterFunc确认退出,避免误判系统goroutine波动。
-
Go包名、导入路径和模块路径必须全小写,大小写敏感是硬性规则;macOS/Windows因文件系统不区分大小写可能“侥幸”通过,但Linux下必然失败,CI需在Linux容器中运行。
-
map[string]int最直接用于频次统计,支持O(1)操作,但需注意未初始化key的零值覆盖风险;有序场景可用[]int+sort.Search;多维分组推荐struct作key;map遍历顺序随机,需显式排序。
-
使用net/http解析GET查询参数可通过r.URL.Query()获取url.Values,调用Get获取单值;2.多同名参数可用key["param"]获取[]string所有值;3.POST表单需调用ParseForm后通过Form.Get或FormValue读取。
-
使用flag包可解析命令行参数,支持string、int、bool类型并设置默认值和说明;2.通过flag.Args()判断参数实现子命令逻辑,结合全局flag如verbose控制日志输出,提升CLI工具的用户体验。
-
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无内置UTF-16编解码支持,unicode/utf16仅转换rune与uint16切片,不处理字节序、BOM或空终止;应使用golang.org/x/text/encoding/unicode包,并注意WindowsAPI调用时手动补零及正确预估长度。