-
Mutex用于保护共享状态,适合多goroutine读写同一变量时的同步;Channel用于goroutine间通信,适合数据传递与任务协调。
-
Go字符串底层是UTF-8编码的只读字节序列,len(s)返回字节数而非字符数;中文占3字节、emoji如“?”占4字节;遍历应使用range获取rune,避免用索引截取或手动拼接非法UTF-8。
-
Go官方plugin包仅支持Linux/macOS,Windows不支持;要求主程序与插件完全相同的Go版本和构建参数;插件须通过共享接口交互,无法热重载,且需显式调用导出初始化函数。
-
Go中len()返回字节长度而非字符数:len("你好")得6,utf8.RuneCountInString()才得2;ASCII字符单字节单rune,中文/emoji等多字节但仅一rune。
-
sync/atomic.Value仅支持可复制类型,存指针/map/slice等会导致未定义行为;必须类型一致、避免并发修改共享内存;Load返回副本,修改不影响原值;适用于读多写少的全量替换场景。
-
指针在Go语言中可以作为map的键,但其比较基于地址而非值。1.指针类型是可比较的,只要它们指向的地址不同,即使值相同也会被视为不同的键;2.若需根据内容判断,应使用结构体本身或提取字段组合成键;3.nil指针可作为键,所有nil指针会被视为相同键。使用时需注意隐晦问题,避免误用导致逻辑错误。
-
使用http.FileServer提供静态文件服务时,必须显式指定安全根目录(如http.Dir("/path/to/uploads")),禁用路径遍历,并通过中间件校验URL路径;文件上传需另写POSThandler,调用r.ParseMultipartForm解析multipart/form-data。
-
http.Get仅适合本地调试,因无超时、不处理重定向、不复用连接;生产环境须自建*http.Client并设Timeout与Transport,且resp.Body必须defer关闭,POSTJSON应使用bytes.NewBuffer避免重复序列化,client需全局复用以复用连接池。
-
交叉编译必须同时指定GOOS和GOARCH且关闭CGO_ENABLED=0,否则易链接失败或生成不可部署二进制;仅设其一将默认当前平台,导致伪交叉编译;纯Go程序需禁用cgo,含import"C"的代码(含依赖)会强制启用cgo并引发冲突。
-
直接用colly.NewCollector()会漏抓页面,因其默认不启用重试、不处理重定向、不设User-Agent,遇302/403即放弃;真实网站多校验UA,无设置易被nginx拦截。
-
Go不支持真正的全局常量,但可通过点导入或统一错误包等方式实现跨包访问;然而直接省略包名会损害可读性与可维护性,推荐使用语义化错误类型或带前缀的常量导出。
-
核心是“要不要”而非“能不能”:标准库encoding/json已足够健壮,自写反射序列化仅适用于需绕过标签规则、序列化私有字段、注入元信息或对接非标协议等特定场景。
-
应使用prometheus.NewCounter定义请求总数和错误总数指标,提前注册带ConstLabels的Counter并在handler中调用Inc(),不可用全局变量或Set();需按维度打标签时改用NewCounterVec。
-
Go的switch不支持case后跟布尔表达式,因其要求带表达式的switch中所有case值必须是编译期可确定、与switch表达式类型兼容的常量;而x>5是运行时bool表达式,既非常量又类型不匹配。
-
使用反射调用函数需先通过reflect.ValueOf获取函数值,再准备对应类型的参数切片并调用Call方法,返回值为[]reflect.Value类型,从中提取结果并做类型断言即可。