-
应使用github.com/qiniu/go-sdk/v7,禁用qiniupkg/storage和github.com/qiniu/api.v7;导入路径须含/v7,token生成需绑定bucket名与区域,上传用PutFile/Put区分文件与内存数据,公私有URL构建须匹配域名后缀与区域。
-
最可靠方法是Go调用ffmpeg并严格处理边界:规范路径、检查ffprobe存在、用ffprobe查时长再计算截图时间点、选jpg格式、控制并发、校验错误而非仅文件存在。
-
time.Parse解析失败的根本原因是layout与输入字符串不严格匹配,必须使用Go特定参考时间“2006-01-02”格式定义layout;中文或非标格式需预处理;应优先用time.ParseInLocation显式指定时区;Unix时间戳须先转int64再用time.Unix构造。
-
Type.Size()与unsafe.Sizeof()结果一致,均包含对齐填充;区别在于Type.Size()作用于类型描述,unsafe.Sizeof()作用于值,二者均非字段原始大小之和。
-
Golang通用任务调度器需解耦任务定义、触发逻辑与执行控制,含Task、Trigger、Scheduler、Executor四大模块,支持扩展接口、轻量状态管理及安全并发机制。
-
微服务不适合小团队和MVP阶段;单体架构更合适,因团队规模小、业务简单、日活低,微服务会增加运维与协作成本。
-
interface{}是万能容器而非万能类型,只能存值且需类型断言或类型切换才能安全取出;它适用于泛参、JSON解析等过渡场景,但深层嵌套访问繁琐,频繁断言时应改用接口或泛型。
-
最稳妥做法是用viper读取YAML配置:命名config.yaml放根目录,显式设置路径与名称,ReadInConfig后必须检查错误;环境配置通过SetDefault("env","dev")+动态拼接文件名+MergeInConfig实现;优先用字段名匹配(如redis_url→RedisUrl),必要时用mapstructuretag;禁用AutomaticEnv(),改用BindEnv()显式绑定;开发可热重载,生产务必重启生效。
-
Go中遍历结构体字段需用reflect包,仅支持导出字段:用reflect.TypeOf获取类型,NumField()和Field(i)遍历,field.Name、field.Type、field.Tag分别获取字段名、类型、标签;非导出字段被忽略。
-
Go1.18+不再需要GOPATH,模块由go.mod定义边界,多项目应独立存放;仅本地多模块协同开发时才用gowork创建临时工作区,避免将其误作项目目录规范。
-
私有函数不可被外部包直接调用,测试文件须与源文件同目录且同包名(如packagemypkg)才能访问;应优先通过导出函数的输入输出覆盖私有逻辑,而非强行导出或滥用//go:linkname。
-
用go/parser解析算术表达式需包装为完整语句(如"_=1+2"),手动提取ast.BinaryExpr等节点,不支持变量和函数调用,错误提示不友好;手写50行递归下降解析器更简单可控,需自定义分词、处理负号歧义、统一float64计算并智能格式化输出。
-
应使用gorilla/websocket管理WebSocket连接,它封装了握手、帧处理、ping/pong等生命周期操作;需双goroutine读写、带超时写通道、服务端补全时间戳与校验clientId、用sync.Map管理连接、设置读超时与心跳,并优先优化广播范围与日志而非JSON性能。
-
必须传入结构体指针给reflect.ValueOf()才能修改字段,否则因不可寻址导致Set操作panic;读取需类型转换,修改前须检查CanAddr()和CanSet(),且类型严格匹配。
-
服务注册须待gRPC和健康检查服务就绪后执行,避免过早注册导致调用失败;服务发现需容忍空列表与临时故障,采用降级地址、缓存及长轮询优化;etcd与Consul的Watch机制差异要求分别适配;gRPC默认resolver不支持动态权重,需自研balancer实现指标驱动路由。