-
Go字符串不可变,底层为只读结构体{ptr*byte,lenint},禁止索引赋值;修改需转[]byte或[]rune操作后重建,拼接推荐strings.Builder。
-
文件I/O是同步且可定位的,网络I/O是异步封装、不可Seek的流式操作;前者依赖系统调用阻塞线程,后者由netpoller事件驱动实现高并发。
-
Go的rpc.Codec接口必须同时实现ReadRequestHeader和WriteRequestHeader,因为RPC协议栈严格依赖“头-体”二阶段流程:先通过header获取服务名、方法名等元信息,再据此解析body;缺一则在server.ServeCodec或client.Go中触发panic,错误多为nilpointerdereference或invalidmemoryaddress。
-
在Golang中,sync.Mutex和sync.RWMutex用于解决并发访问共享资源时的数据竞争问题,1.sync.Mutex是互斥锁,同一时间只允许一个goroutine访问临界区,适用于读写频率相近或写较多的场景,典型应用包括保护共享变量、结构体字段和配合sync.Once进行一次性初始化;2.sync.RWMutex是读写锁,允许多个读操作并发执行但写操作独占,适用于读远多于写的场景如配置管理、缓存系统和状态监控,能显著提升并发性能;3.选择时应根据读写比例决定,读写接近用Mutex,读远多于写
-
UnixDomainSocket服务端需确保socket文件路径有写权限且父目录可创建文件,启动前应os.Remove旧文件并用deferos.Remove清理,推荐使用/var/run/myapp.sock等专属路径;客户端连接失败多因路径不存在、权限不足或地址复用,应每次新建*net.UnixAddr并重试;读写需处理字节流边界,建议封装长度头或换行分隔;高级功能如凭证传递、fd传递需用golang.org/x/sys/unix,注意显式调用unix.Listen和精确计算cmsg空间。
-
应复用github.com/golang-jwt/jwt/v5并严格校验exp/nbf、统一401响应;KongGo插件须通过PDK获取上下文、调用pdk.response.exit终止流程,禁用net/http、os.Exit和panic。
-
手动触发GC不一定能解决内存泄漏,因其仅发起回收而不保证完成,且无法清除仍被根引用的泄漏对象;应结合MemStats监控HeapAlloc/HeapObjects曲线、pprof分析间接引用链,并用goroutine栈dump排查协程泄漏。
-
Go中定义接收任意多个字符串的变长函数需用funcname(args...string)语法,...string必须位于参数列表末尾,args在函数内为普通[]string切片,调用时可传零个、多个字面量或加...展开的切片。
-
原子操作仅适用于单字段无竞争场景,多字段协同、高竞争或需内存序保证时应优先用mutex;结构体字段不可直接原子更新,须拆分或用atomic.Value;忽略内存序在非x86架构易出错。
-
nats.Connect连不上JetStream是因服务端未启用,需加-js参数或配置jetstream块;js.Publish失败、消息丢失、重复消费等问题均源于JetStream未正确配置和使用。
-
使用gorilla/websocket在Golang中实现文件传输需遵循以下步骤:1.建立WebSocket连接,通过Upgrader结构体将HTTP升级为WebSocket;2.发送端分块读取文件并通过conn.WriteMessage发送;3.接收端持续监听并拼接数据至文件完成;4.可扩展发送元信息以支持多文件及进度显示;5.注意缓冲区大小、并发控制和错误处理。整个过程依赖于WebSocket的字节流特性,确保数据可靠传输。
-
Worker启动时必须接收context.Context参数,否则上层无法取消;传context.Background()或内部新建独立ctx均导致ctx.Done()永不触发、select无法响应取消。
-
Protobuf的Go实现不支持反射直接序列化struct,必须使用protoc-gen-go生成的类型;Avro的Go库(如hamba/avro)支持运行时schema+reflect,适用于动态适配场景。
-
Gin本身无内置优雅关闭,需用http.Server.Shutdown()配合signal监听和context超时,手动管理所有goroutine退出;漏掉任一环节(如ticker、DB、Redis或子goroutine未响应ctx.Done)将导致进程卡住。
-
sync.Map适用于小流量、单机、QPS几百的幂等场景,但无自动过期、不跨进程;需用结构体缓存结果、定时清理、避免key污染,Redis需原子SetNX+EX,DB唯一索引为兜底。