-
Go语言只有值传递,但可通过指针模拟引用行为;传指针仅复制地址(8字节),避免大对象拷贝,且能修改原值;需根据是否需修改、拷贝成本及方法接收者需求决定是否用指针。
-
Go的http.Client默认不重试,需手动实现;仅对幂等请求和特定网络错误(如net.OpError)重试,配合指数退避加jitter、最大次数/时间限制,并用backoff库更稳妥。
-
Go模块使用语义化版本vX.Y.Z管理依赖,X为不兼容API变更,Y为新增功能,Z为问题修复;主版本≥2时需在导入路径添加/vN后缀,确保版本共存;预发布版本如v1.0.0-beta不被默认选用,建议生产环境使用稳定版本。
-
Go语言允许在for循环内部用:=重复声明外部已定义的同名变量,这是因为每次声明都发生在独立的作用域内,实际创建的是新变量而非覆盖原变量,这种现象称为“变量遮蔽”(variableshadowing)。
-
Go1.20+应使用rand.New(rand.NewSource(42))创建确定性PRNG实例,并将其作为参数注入被测函数,避免依赖已弃用的rand.Seed()或全局rand状态,确保测试可重现。
-
goroutine泄露典型表现为内存持续上涨、pprof显示大量runtime.gopark状态goroutine、HTTP响应变慢但CPU不高;主因是未监听ctx.Done()导致goroutine卡在select或time.Sleep中无法退出。
-
cron.New()后任务不执行是因为调度器默认暂停,必须显式调用c.Start()并阻塞主goroutine(如select{}),否则程序立即退出;秒级需cron.WithSeconds();停止时用sync.WaitGroup确保任务完成;时区需显式加载并fallback。
-
lambda.Start是Go函数在AWSLambda上运行的唯一入口,必须调用它注册事件循环;否则因无有效执行点导致fork/exec失败、冷启动超时且无日志;需严格遵循handler签名、交叉编译为Linux二进制、传递context并避免execformaterror。
-
log.SetFlags()通过位掩码控制日志元信息,如log.Ldate|log.Ltime|log.Lshortfile;SetPrefix()设置行首固定前缀;自定义时间格式需重写Output;推荐用log.New()创建独立实例而非修改全局logger。
-
Go中结构体必须用type显式定义,不可内联;字段导出性由首字母大小写决定,标签不影响可见性;初始化推荐字段名赋值方式;嵌入是组合而非继承;structtag须用反引号、空格分隔、双引号包裹值。
-
可通过调用sql.DB.Stats()获取实时连接池指标,包括OpenConnections、Idle、WaitCount和WaitDuration等快照值,需定时采集;DB.Ping()不反映池健康状况;合理配置SetMaxOpenConns、SetMaxIdleConns和SetConnMaxLifetime才能优化池行为;接入Prometheus时需按指标类型(gauge/counter)正确暴露。
-
在Go中,nil接口值不携带任何动态类型信息,因此无法通过x.(*T)断言为任意具体指针类型;类型断言要求接口值非nil且其动态类型必须精确匹配目标类型。
-
rpcserver:servicenotfound是因注册中心未连通或服务名不一致所致,需检查etcd/Nacos状态、配置地址、服务名大小写、启动顺序及-f参数;client调用超时则多因TLS未禁用,应加WithInsecure()。
-
装饰器模式通过接口和组合在Golang中实现功能增强,定义UserService接口后,BaseUserService提供基础实现,LoggingDecorator和CacheDecorator分别添加日志与缓存功能,支持链式叠加,调用顺序为外层到内层,适用于日志、监控、权限等场景,保持单一职责,提升代码复用性。
-
Go错误处理核心是将error视为值而非异常,需通过自定义类型(如UserNotFoundError)、%w包装、AppError统一转换,在service层完成语义识别与分类,避免中间层字符串拼接或defer覆盖,确保错误可判断、可响应、可监控。