-
Go中sync.WaitGroup与sync.Mutex组合可协调goroutine生命周期与共享资源访问:WaitGroup通过Add/Wait/Done控制任务启停,Mutex通过锁机制防止数据竞争,二者分工明确、配合自然。
-
new用于分配任意类型的内存并返回指向零值的指针,而make专用于初始化切片、映射和通道并返回已初始化实例。1.new(T)为类型T分配清零内存并返回*T指针,适用于基本类型、结构体等;2.make仅用于创建切片、映射和通道,会初始化其内部结构使其可直接使用;3.声明变量时零值可能为nil(如切片、映射、通道),需make确保可用性;4.new是通用内存分配器,make则是特定复合类型的构造函数,封装了复杂初始化逻辑。
-
&取地址,解引用:&获取变量内存地址(如p:=&x,p为x类型),通过指针访问或修改值(如x=21);仅可寻址变量可取地址,指针不可运算,常用于函数传参、方法接收者及new(T)初始化,需防nil引发panic。
-
Go函数不能直接返回多个error,只能通过errors.Join(Go1.20+)或自定义MultiError类型将多个错误合并为一个error值,以支持错误链和匹配;互斥路径或需隐藏细节时不宜使用。
-
Go语言并发安全计数器首选atomic原子操作(如atomic.AddInt64),适用于int64等基础类型高频更新;复杂逻辑或多字段联动时用sync.Mutex或RWMutex;须封装为结构体并用-race检测验证安全性。
-
合理配置GOMAXPROCS以匹配CPU核心数,显式设置runtime.GOMAXPROCS(runtime.NumCPU());通过ReadTimeout、WriteTimeout和IdleTimeout控制连接生命周期,防止资源堆积;启用net/http/pprof采集CPU、内存及goroutine数据,结合gotoolpprof分析性能瓶颈;优化中间件逻辑,避免阻塞操作,使用sync.Pool缓存对象,减少JSON序列化开销,静态资源交由Nginx等代理处理,提升整体并发性能。
-
最简HTTP服务只需两步:注册路由和启动监听;需设JSON响应头、校验请求方法、正确使用中间件、显式配置超时。
-
Go反射不能实现插件机制,仅能辅助调用已加载的类型和方法;真正的插件需通过plugin包(Linux/macOS)或进程间通信(如HTTP/gRPC)实现,反射仅用于类型断言和数据处理。
-
最可靠方式是用reflect.TypeOf(v).Kind()==reflect.Ptr判断;对interface{}需先检查reflect.ValueOf(v).IsValid();若需判断指向特定类型,须先确认为指针再调用Elem()。
-
Go微服务需通过OpenTelemetrySDK在HTTP/gRPC入口中间件中解析traceparent等header并用Extract+StartSpanWithOptions实现自动注入trace_id/span_id,严禁手动拼接或混用Jaeger与OTel。
-
stringer工具需在类型定义已知但String()方法尚未生成时避免直接调用该方法;推荐方案是将类型定义与方法调用分离,或依赖fmt等标准库自动触发Stringer接口,而非手动调用未生成的String()。
-
Go变量声明需按场景选择:全局用var,函数内快速逻辑用:=,批量定义用var()块;var可显式指定类型或自动推导,:=仅限函数内且需新变量,var()支持混合声明并提升可读性。
-
要测试私有函数,必须使用同包测试方式,即测试文件与源码文件属于同一包,包名一致且不使用_test后缀,例如packagemathutil而非mathutil_test,这样才能直接访问私有函数;错误地使用packagexxx_test会导致无法访问私有标识符;正确做法是在xxx_test.go文件中保持原包名,直接调用私有函数进行测试,如TestAdd中调用add(2,3);仅在私有函数逻辑复杂且关键时才直接测试,优先通过公共接口间接覆盖;可通过gotest-cover查看覆盖率;极端情况下可导出函数变量
-
Go中命令模式核心是定义无参无返回值的Command接口,通过结构体封装Receiver和参数实现解耦,Invoker仅依赖接口执行命令,Undo需命令自行保存上下文。
-
测试channel需避免死锁,使用select与超时机制确保测试稳定;2.验证关闭channel时能正确检测零值与false状态;3.生产者-消费者模型中结合sync.WaitGroup保证goroutine完成。