-
GORM的AutoMigrate仅执行安全的增量同步,不删除字段或索引、不支持回滚;需显式传入导出结构体,确保连接成功后调用,并注意数据库类型差异与外键配置。
-
依赖注入可通过反射实现IoC容器,提升代码可维护性。1.通过构造函数传入依赖而非内部创建,实现解耦;2.使用reflect包获取构造函数参数类型,动态解析依赖;3.构建注册-解析结构,用map保存类型与构造函数映射;4.实现Get方法递归解析依赖,调用构造函数生成实例并支持单例缓存;5.注意接口注入、构造函数规范、错误处理及性能优化等问题。
-
go-licenses无法输出许可证列表主因是模块模式未启用或GOPATH混用;需确保GO111MODULE=on、正确初始化go.mod、避免在$GOPATH/src下运行,并用--include_indirect处理间接依赖,同时检查replace目标LICENSE文件编码与位置。
-
Go1.21+原生slog是最简可行的结构化日志方案,需显式指定JSON/TextHandler、避免误用slog.With、传值需符合序列化限制、按级别分离字段、注意输出链路缓冲与截断问题。
-
Pipeline核心是“每阶段只做一件事+channel串联”,关键在正确控制channel关闭时机和数据流向:输入用range需上游关闭,输出channel由最后使用者关闭,过滤时用select+default防阻塞。
-
VSCode需精简插件、启用gopls、禁用冲突格式化;GoLand需校准SDK与模块配置、关闭冗余检查;两者均应集成终端、支持单文件运行、配置代码片段并强化Git提醒。
-
Golang的net/rpc包可实现远程过程调用,需定义符合规则的服务方法和数据结构;2.服务端注册实例并监听HTTP端口,客户端通过Dial连接并调用远程方法;3.异常处理需关注网络错误、超时及服务端返回错误,建议设置连接与调用超时;4.默认使用gob编码,不支持跨语言,适用于轻量级内部通信。
-
sync.Once比手写双重检查更可靠,因其内置原子操作与互斥锁组合,天然解决内存可见性、指令重排和竞态问题,避免nilpanic、未初始化对象返回等错误,且性能优、行为稳定。
-
Go1.16起ioutil.TempFile被弃用,应改用os.CreateTemp;二者签名一致,返回(*os.File,error),且CreateTemp默认权限0600更安全;需注意临时文件清理,避免泄漏。
-
工厂函数返回接口类型时,必须确保所有实现完整满足接口契约,否则编译失败;应先定义接口、用静态检查验证实现,稳定方法签名,避免硬编码和panic,合理注入依赖,并明确声明线程安全性。
-
HTTP客户端请求失败时,err不一定代表网络断开;4xx/5xx状态码下err为nil,需检查resp.StatusCode;真正需重试的是net.OpError、context超时等底层错误,且须保障幂等性。
-
Go的main包虽不可被其他包导入,但可通过gotest*.go同时编译主文件与测试文件,并在packagemain下直接调用内部函数进行单元测试;关键在于测试函数命名规范(TestXxx)和参数类型(*testing.T)。
-
Go程序需通过Docker官方SDK(github.com/docker/docker/client)调用DockerEngineAPI获取容器状态,初始化时注意DOCKER_HOST和权限;ContainerList默认只返回运行中容器,需All:true;Events()支持实时监听start/die等事件,比轮询更高效。
-
gotoolcompile-gcflags="-m-l"用于查看变量逃逸分析结果,核心是理解编译器为何将变量分配到堆上:当值生命周期超出当前栈帧(如返回局部变量指针、赋给全局变量、闭包捕获、接口参数传入等)即触发逃逸;-l禁用内联以避免干扰判断;输出含“escapestoheap”或“movedtoheap”才表示真实逃逸,“leakstoheap”则更严重;高频小对象逃逸会加剧GC压力。
-
RedisStreams是Go中最实用的轻量级分布式队列方案:支持消费者组、ACK、水平扩展;需注意XADD限长、XGROUP预创建、XCLAIM处理pending消息。