-
合理使用锁和同步机制可提升Golang高并发性能。应缩小锁范围,避免在锁内执行阻塞操作,优先用原子操作处理简单共享变量,读多写少场景用sync.RWMutex,结合sync.Pool减少内存分配,通过pprof分析优化锁竞争。
-
Go的Base64编解码需用encoding/base64包,输入必须为[]byte,推荐StdEncoding(标准)或URLEncoding(URL安全,用-/_替代+/,省略=),解码务必检查error,避免编码类型混用。
-
Go包文档该写在哪儿才被godoc和VSCode正确识别Go不认README.md作为包文档——哪怕你写得再漂亮,godoc、godoc(或新版godoc命令)和大多数IDE都不会把它当包说明。真正起效的只有源码文件顶部的注释块。必须是紧贴package声明上方的「顶级注释块」,且中间不能空行注释必须是//开头的普通注释,不是/**/块注释(后者会被忽略)如果包有多个.go文件,只有一份注释生效:按字典序第一个含包注释的文件胜出别在main包里写长文档
-
Go编译默认不嵌入DWARF调试信息,需加-gcflags="all=-N-l"并避免-ldflags="-s-w";core文件需ulimit-cunlimited且未被core_pattern重定向;gdb无法直接识别goroutine,需结合infothreads与bt逐线程分析。
-
Cmd.StdoutPipe()不能直接连shell管道,因os/exec.Cmd不解析shell语法,需用exec.Command("/bin/sh","-c","cmd1|cmd2")显式调用shell解释器,并注意Start后读取、分别处理stdout/stderr、读完pipe防阻塞。
-
import用于导入外部包以使用其导出项,需掌握路径规则(标准库、第三方、本地)、别名避免冲突、下划线触发初始化、三段式分组管理。
-
正确使用Go反射需减少调用频率、缓存类型信息、避免热路径使用。通过初始化阶段缓存字段元数据到map,后续直接查表;优先用指针赋值并统一处理指针层级;已知类型范围时用类型断言替代反射;合理设计架构可使运行时性能接近原生。
-
ReadTimeout应设为5s~15s,覆盖请求头与体到达最坏预期;WriteTimeout设为10s~30s,从响应头写入完成起计时;Go1.22+改用ReadHeaderTimeout+IdleTimeout+context控制。
-
锁竞争导致goroutine频繁阻塞和调度开销,拉高延迟、降低吞吐;应通过trace定位竞争、细化锁粒度、慎用RWMutex并避免defer误用。
-
Go接口是隐式实现的方法集合,定义时仅声明方法签名,结构体自动满足所有方法即实现接口;支持嵌套组合行为,通过类型断言安全转换具体类型。
-
Go反射非万能工具,适用于结构体字段遍历等场景,但性能差、类型不安全;应优先用接口或泛型,仅在需统一处理动态标签时用reflect.StructField,并注意导出、tag解析、嵌套递归、可寻址性及Kind与Name区别。
-
在Golang中处理网络IO超时错误需先通过net.Error接口判断,优先检查Timeout()方法以识别超时,结合Temporary()判断可恢复性,并设置合理的连接与读写超时时间,辅以带退避策略的重试机制避免雪崩。
-
Go测试函数命名应为TestXxx_WithCondition_ReturnsResult,如TestParseURL_WithEmptyString_ReturnsError;需避免编号式命名,用下划线分三段表达输入→输出,表驱动测试中setup应提取为私有函数,table仅存差异数据,helper函数禁用t.Fatal,测试文件须与被测代码同目录且包名加_test后缀。
-
在Go模板中,不能使用类似.a[2]的方括号语法访问数组或切片元素,而必须通过内置函数index实现安全、合法的索引访问。
-
fori,v:=rangeslice中v是副本,修改v不影响原切片;须用users[i].Age=30或&users[i]修改;取&v地址会全部指向最后一次迭代值;map遍历无序,增删键值行为未定义;字符串range返回字节索引,多字节字符需转[]rune处理。