-
bufio.Reader不是goroutine安全的,多个goroutine同时调用其Read方法会导致数据竞争和未定义行为;必须通过外部同步机制(如互斥锁、channel或单goroutine串行读取)确保同一实例仅被一个goroutine访问。
-
Go结构体默认是值类型,赋值或传参时复制全部字段;通过指针可实现引用语义——多个指针共享同一实例,修改相互可见。string和slice的“类引用”行为源于其内部结构,并非结构体本身具备引用语义。
-
长轮询不能直接用http.HandleFunc配合无限循环,因HTTPhandler默认同步阻塞,for{}或time.Sleep会卡死goroutine、耗尽并发能力,且客户端超时断开后Go不自动清理goroutine导致泄漏;须禁用读写超时,用context、select和time.After实现三重控制并defer清理资源。
-
Go无构造函数,推荐用零值语义、结构体字面量和NewXXX工厂函数初始化;嵌入可复用字段但不触发初始化,默认值应统一收敛至工厂函数。
-
Go微服务中配置mTLS需手动设置tls.Config:服务端用RequireAndVerifyClientCert+ClientCAs,私钥权限0600;gRPC需在Interceptor中解析TLSInfo获取身份;灰度迁移宜双端口或反代透传;curl报错多因未指定CA证书。
-
golang.org/x/oauth2需自行补全token刷新失败处理、并发刷新冲突、Expiry校验、IDToken签名及声明验证等安全机制,否则易致越权、伪造、凭据泄露等风险。
-
Go中自定义包需属模块,用gomodinit初始化并设模块路径;导入时须用模块路径而非文件路径,本地开发用replace重定向,不可用goinstall安装非main包。
-
本文详解如何解决CGO调用CUDANVRTCC++代码时因C++标准库路径错误导致的bits/c++config.h:Nosuchfileordirectory编译错误,核心在于统一GCC版本、显式指定多架构系统头路径,并避免直接包含<iostream>等C++标准头。
-
BadgerDB是基于LSM树的KV数据库,但采用value分离存储(value写入独立log,key+pointer入LSM),降低读放大;缺点是GC复杂、valuelog不支持随机删改,易现索引与value不一致。
-
io.Copy是合并多个文件最直接可靠的选择,它通过固定缓冲区流式处理避免内存溢出,需正确打开文件、控制顺序、过滤空文件、校验完整性并保证原子性。
-
Go中方法必须绑定到命名类型,即通过typeT...声明的新类型,不能为未命名基础类型或类型别名定义方法;值接收者不修改原值,指针接收者可修改;接口实现需匹配方法集,*T的方法集包含值和指针接收者方法,而T仅含值接收者方法。
-
errors.New返回的错误不能直接比较相等,因其每次调用都创建新指针实例,故err==errors.New("x")恒为false;应使用errors.Is、自定义类型或谨慎用err.Error()。
-
结构体字段顺序影响内存占用是因为Go不自动重排字段,需手动按对齐要求从大到小排列以减少填充;可用unsafe.Sizeof与Offsetof或structlayout工具检测填充。
-
bufio包通过内存缓冲减少系统调用次数而非加速读写;WriteString后需显式Flush才能写入磁盘;ReadString遇EOF可能报错,须检查err;缓冲区大小应依场景调整;Reader/Writer混用同一文件需避免竞态。
-
Go1.10引入-failfast标志,可使单个包内测试在首次失败后终止;但该标志不跨包生效。本文详解其用法、局限性,并提供可靠的工作方案以实现多包场景下的“首错即停”。