-
备忘录模式通过发起人、备忘录和管理者三者协作,实现对象状态的保存与恢复。在Go中,利用结构体和封装特性可清晰实现该模式,适用于撤销操作、快照保存等场景,同时保障封装性与代码可维护性。
-
GoWeb开发应优先使用标准库html/template,静态资源通过http.FileServer或Nginx托管,依赖显式引入、编译时确定,避免运行时动态处理。
-
Golang并发池通过固定数量workergoroutine和channel实现静态并发控制,避免资源耗尽;核心是无缓冲jobschannel配合N个worker,任务提交自然节流,结果通过带缓冲resultschannel收集,并用WaitGroup与关闭channel确保优雅终止。
-
strings.Replace高频调用性能差因每次返回新字符串并触发内存分配与完整拷贝;应优先用预编译的strings.Replacer或切片拼接;fmt.Sprintf在纯拼接场景下比strings.Builder慢3–10倍,宜用+、strconv或Builder;大量修改或I/O场景改用[]byte可避免重复复制;strings.Builder复用需显式Reset()并合理预分配容量。
-
Gin注册RESTful路由需用c.Param("id")读取路径参数,不可用c.Query();GORM查单条须检查gorm.ErrRecordNotFound;创建失败需校验并调试SQL,错误响应要脱敏。
-
io.Pipe适用于单生产者单消费者goroutine的同步场景,如日志生成与HTTP响应解耦;不适用于内存缓存、多读多写或同goroutine读写,因其无缓冲且非并发安全。
-
匿名结构体是Golang中无需预先定义类型的临时结构,可直接声明初始化,如varperson=struct{NamestringAgeint}{"Alice",30};支持在函数参数、返回值、map或切片中使用,适用于一次性数据传递,提升代码简洁性,但应避免在公共接口频繁使用以保持可读性和可维护性。
-
cmd目录仅存放main入口,每个子目录对应独立二进制;业务逻辑须下沉至pkg(对外API)或internal(私有实现),禁止cmd直接import业务包、共享全局状态或写测试。
-
单元测试中应避免直接调用database/sql或gorm.DB,因其破坏快、稳、可重复、隔离性;推荐用接口抽象+mock(如testify/mock)替代;集成测试才连真实数据库,并严格管控生命周期与清理。
-
Go中变量名重复导致的shadowing是真问题,因编译器静默复用或覆盖同名变量,引发逻辑bug却无报错警告;常见于:=声明、有名返回值、for循环及struct字段同名场景。
-
reflect.Value.IsZero判断Go类型系统的零值,如int为0、string为""、*int为nil;不适用于业务空逻辑,且对无效值会panic,需先校验IsValid。
-
golang.org/x/time/rate是官方维护的轻量、无锁、并发安全令牌桶限流库,需复用实例而非每次新建,支持动态调速;HTTP中间件中应优先用ReserveN配合上下文检查,避免误用Allow或Wait导致逻辑错误。
-
为什么直接用hash/crc32+取模会出问题一致性哈希不是“取模的升级版”,而是为了解决节点增减时大量key重映射的问题。普通取模在加一台机器后,几乎所有key%N都会变,缓存击穿、数据库压力陡增——这在分布式缓存或分片存储里是致命的。真正要用一致性哈希,核心是把节点和key都映射到同一个环上,靠顺时针找最近节点来路由。Go标准库不提供现成实现,得自己搭骨架。别用math/rand做虚拟节点随机分布:它默认没seed,多goroutine并发调用可能产出重复h
-
必须用sync.Mutex而不是sync.RWMutex的情况有三:一是写操作频繁或写后需立即读新值,避免读协程饿死;二是多个字段联动更新需原子性,RWMutex写锁不保证跨字段一致性;三是需递归锁(但实际RWMutex不支持,Mutex本身也不支持,此处强调不可替代性)。
-
Go函数返回错误的标准写法是error必须作为最后一个返回值,类型为error接口,成功时返回nil;应使用errors.New或fmt.Errorf(%w包装)构造错误,禁止忽略或裸panic,自定义错误需实现Error()方法。