-
defer在当前函数return语句执行前、返回值已确定后执行;命名返回值可被defer修改,临时返回值则不能;多个defer按LIFO顺序执行;参数在defer定义时求值,函数体延迟执行;不宜用于耗时或可能panic的操作。
-
Go的RPC错误处理需区分底层错误和业务错误:call.Error表示网络或序列化问题,reply中的Error字段表示业务逻辑错误;2.服务端应优先将错误信息放入reply结构体而非仅返回error;3.客户端必须同时检查call.Error和reply内容以完整处理错误。
-
gomodvendor可将依赖复制到本地vendor目录,确保离线构建;需先初始化模块、整理依赖并生成go.mod和go.sum,再执行gomodvendor生成vendor文件夹;构建时使用gobuild-mod=vendor强制读取vendor中的依赖,保证构建一致性。
-
Go程序通过exec启动的重启进程脱离了shell的进程组控制,导致终端发送的SIGINT无法被正确传递;根本原因在于新进程未被shell管理,需显式恢复前台作业控制或继承会话/进程组属性。
-
反射和泛型是Go语言中提升代码灵活性的两种机制,但用途和机制不同。反射用于运行时动态获取类型信息并操作对象,适用于处理未知结构的数据,如通用序列化、框架构建等,常见于需要动态调用方法或访问字段的场景;泛型则是在编译期指定类型参数,适用于多种类型共用逻辑且类型已知范围的情况,如通用容器、减少重复代码,同时保持类型安全。两者主要区别在于类型检查时机、性能、安全性及适用场景:1.反射在运行时检查类型,泛型在编译时检查;2.泛型性能更高,反射因类型解析带来额外开销;3.泛型类型安全,反射易出错;4.反射适合真正动
-
panic立即终止当前goroutine并执行defer,无recover则程序退出;recover仅在defer中直接调用才有效,且不能跨goroutine,不可用于常规错误处理。
-
在Go中,若想通过函数参数修改外部指针变量的值(如将*mgo.Session从nil初始化为有效地址),必须传递指向该指针的指针(即`T)**,否则仅传递*T`会导致函数内对指针的赋值仅作用于副本,无法影响调用方变量。
-
Go中错误日志分级需借助zap等结构化日志库或自定义LevelError类型,按错误来源、行为和上下文区分Warn/Err/Fatal级别,普通错误如参数校验失败用Warn,严重错误如DB连接丢失用Fatal或标记critical。
-
Go微服务配置热更新需手动实现:viper.WatchConfig仅通知变更,须配合SetConfigType、OnConfigChange及ReadInConfig重载;动态配置(如日志等级)可热更,静态项(如服务名)必须重启;资源(DB连接池、HTTP客户端)需主动调用API或重建实例,并保障线程安全与可观测性。
-
关键不是“要不要缓存”,而是“缓存什么、什么时候失效、谁来清理”;用sync.Map+文件修改时间做轻量级缓存适合中小规模Web服务。
-
在Go中,对值类型切片追加元素后取地址存入map,可能因底层数组扩容导致map中的指针指向已废弃内存,从而无法反映后续修改——根本解法是统一使用指针切片,确保map与切片共享同一结构体实例。
-
答案是使用testing包的Benchmark函数对比性能。通过编写以Benchmark开头的函数,利用*testing.B参数循环测试不同实现,统计执行时间与内存分配,如对比字符串拼接方式,运行基准测试可量化性能差异,选择更优方案。
-
在Go中,可直接使用标准库encoding/json的json.Marshal()将map[string]string等兼容类型转换为合法JSON字符串,适用于API请求体构造等场景。
-
在Golang中实现服务熔断与降级的核心在于使用熔断器(如sony/gobreaker)和降级策略,以防止故障扩散并确保系统基本运转。1.熔断器像智能开关一样阻止请求流向故障服务,避免雪崩效应;2.降级则在熔断触发或超时时提供备用方案,如返回缓存数据或默认值;3.使用gobreaker库可通过状态机管理实现三态切换(Closed/Open/Half-Open),根据失败率和请求数动态调整;4.配置时需设置MaxRequests、Interval、Timeout、ReadyToTrip等参数,并结合OnSt
-
必须使用http.Redirect实现HTTP重定向,因其自动清空响应体、设置Content-Type、正确处理307/308方法保留、安全解析相对路径;手动写状态码和Location头易出错。