-
使用Consul可实现服务注册与发现,通过API注册服务并设置健康检查;02.Etcd利用租约机制维持服务状态,适合强一致性场景;03.gRPC结合自定义Resolver支持动态服务发现;04.GoMicro框架内置多种注册中心支持,简化开发。
-
支付模拟函数必须返回明确状态码和error,禁用panic;订单状态更新需原子操作;回调须验签、校验timestamp与nonce防重放;依赖应通过interface隔离便于测试。
-
当Go的http.Client访问某些老旧HTTPS服务器(如fl.ru)时,可能因服务端仅支持弱密码套件而触发“remoteerror:handshakefailure”;本文详解如何通过自定义tls.Config启用兼容性密码套件完成连接。
-
Go中map是引用类型,直接传递即可共享底层hmap;*map[string]int极少使用,仅适用于原子替换整个map实例的特殊场景。
-
Go语言标准库网络I/O已默认基于epoll/kqueue/IOCP实现多路复用,用户不应手动调用epoll等系统调用,因其会绕过runtime.netpoll调度,导致goroutine永久阻塞或抢占OS线程;select语句是唯一可控的多路复用入口,仅操作channel、不涉及fd,由编译器转为原子检测,配合default可实现非阻塞轮询,但高频使用易致CPU空转。
-
Go的internal包通过编译器路径检查生效:仅当导入路径含/internal/且调用方在internal目录的祖先路径下才允许导入;它限定编译期API边界,非运行时封装,不可被replace或require绕过。
-
Go语言无法仅靠chan实现高可用消息队列,因其缺乏持久化、跨进程通信、故障转移和背压能力;高可用需结合RabbitMQ等中间件,通过连接重试、独立Channel、durable队列、手动ACK、幂等设计及真实健康检查来保障。
-
默认http.Client不支持自动重试,需手动封装以避免雪崩;retryablehttp默认不重试429/408,需自定义CheckRetry;手写重试须控制重试条件、指数退避、上下文取消及外层总超时。
-
指针数组是固定大小的指针容器,内存连续且不可变;指针切片是动态可变的指针集合,支持灵活扩容与操作,适用于数量不确定的场景。
-
cleanenv不支持自动探测格式,仅通过文件后缀识别解析器:.yaml/.yml→YAML、.json→JSON、.toml→TOML;无后缀或错误后缀将静默失败或panic,且不解析内容;ReadEnv与ReadConfig需手动控制加载顺序与覆盖逻辑。
-
pebble.Open()后必须检查err并显式管理生命周期,Close()是必须调用而非可选,Get/Put需校验nilkey,批量写需防范超长key,Pebble无schema和跨key事务,仅为裸KV存储。
-
预设容量是高频append场景下的必要实践,因超出cap会触发runtime.growslice导致多次分配与复制,应结合数据特征合理估算而非盲目填大数或依赖默认扩容策略。
-
超时错误本质是context.DeadlineExceeded,须用errors.Is(err,context.DeadlineExceeded)判断;HTTP客户端需分层设Timeout、DialContext和ResponseHeaderTimeout;禁用time.AfterFunc替代上下文超时,数据库操作必须用Context方法。
-
Badgerv1升级到v2/v3遇“manifesthasunsupportedversion”需导出/导入迁移;Update比View慢因写锁和WAL;value.log涨满需启用RunValueLogGC;并发读写需避免复用Txn并正确使用快照。
-
Log.Fatal不能用于服务因其调用os.Exit(1)跳过defer、资源清理和HTTP关闭,导致连接硬中断、数据库未释放;仅适用于单次脚本,服务应改用log.Error+显式shutdown+os.Exit或context统一错误处理。