-
最快上手但有坑:json.Marshal/Unmarshal仅处理导出字段,time.Time转字符串,func/chan/unsafe.Pointer等静默丢弃或panic;适用纯数据DTO;copier更智能但不处理接口;自定义Clone最可控;gob保留未导出字段但需注册且类型严格一致。
-
在Go程序中忽略特定错误时,需使用errors.Is判断错误是否为预定义值,或用errors.As转换为具体类型。例如:1.errors.Is用于检查错误是否等于os.ErrNotExist等固定值;2.errors.As用于提取结构体错误类型的字段或方法,需传入指针类型;3.应避免直接比较错误字符串,自定义错误时需导出指针类型以便外部调用者使用。
-
reflect.DeepEqual因逐字段递归比较且不支持func/map(含不可比key)、指针地址敏感、time.Time时区/纳秒差异、map遍历无序、nil与空切片区分、忽略自定义Equal方法等,常误判相等。
-
Go结构体字段顺序直接影响内存占用,因编译器按对齐规则插入padding;应按unsafe.Alignof值分组排列(如8字节对齐组前置),而非简单按类型大小排序,并注意JSON、Cgo、缓存行等约束。
-
推荐新手选msi:它自动设置GOROOT和PATH;zip需手动配置,易出错。GOBIN不必强制设,GO111MODULE建议设为on。验证安装需执行goversion、goenvGOPATH、golist-mall。
-
Jaeger拓扑图为空的主因是Reporter未配置、Context未跨goroutine传播、ServiceName不唯一;需显式设置Sampler与Reporter,正确传递ctx,确保servicename全局唯一且环境隔离。
-
ReadTimeout必须设在Server实例上而非handler中,因其直接作用于conn.SetReadDeadline()使内核超时返回EAGAIN唤醒goroutine;context.WithTimeout仅取消后续处理,无法中断底层readsyscall。
-
Go服务端通过net/http配置跨域需设置Access-Control-Allow-Origin等响应头,并在OPTIONS预检请求中返回200,同时指定Content-Type为application/json以确保前端正确解析JSON。
-
在Golang中追求字符串拼接的极致性能时,首选方法是使用strings.Builder。1.strings.Builder是高效拼接的首选,底层基于[]byte缓冲区,避免多次内存分配,适用于循环和高频调用场景;2.+号拼接简单但低效,适合拼接次数少、代码简洁性更重要的场景,循环中使用会导致性能急剧下降;3.bytes.Buffer灵活但性能稍逊,适用于需要边写边读的场景;4.其他方式如fmt.Sprint和strings.Join各有适用场景,其中strings.Join适合一次性拼接多个字符串。因此
-
go:generate是Go官方提供的标记驱动代码生成触发器,需手动执行,适用于重复性高、结构固定的场景(如protobuf生成gRPC、枚举生成String方法),不自动运行、不参与构建流程,但可与Go脚本深度集成实现可复现、跨平台、零依赖的自动化生成。
-
密码必须用bcrypt哈希存储,注册用bcrypt.GenerateFromPassword(...,bcrypt.DefaultCost),登录用bcrypt.CompareHashAndPassword;JSON请求须用json.NewDecoder解析;数据库连接需全局复用*sql.DB并配置连接池;session应存数据库并设HttpOnlyCookie。
-
Go语言通过reflect.ValueOf获取函数反射值并用Call方法实现动态调用;2.普通函数调用需将参数转为reflect.Value切片传入;3.调用方法时需通过MethodByName获取绑定接收者的反射方法;4.Call返回[]reflect.Value,需按索引取结果并进行类型断言;5.参数类型和数量必须匹配,否则会panic,且应处理多返回值与error类型;6.reflect调用灵活但性能低且无编译检查,建议慎用。
-
不要自己实现服务网格。Istio、Linkerd等已成熟稳定,Go更适合参与生态:开发xDS服务、扩展控制面、集成OpenTelemetry、正确配置网络与Header,或在小规模场景用go-micro等轻量方案。
-
关闭后channel读取分三阶段:缓冲区有数据时正常读取且ok=true;缓冲区空但刚关闭时返回零值和ok=false;此后所有读均稳定返回零值+ok=false;推荐for-range或显式ok判断确保安全。
-
GoModules是Golang官方依赖管理工具,从1.11版本引入,突破GOPATH限制,通过gomodinit初始化项目,goget添加依赖,gomodtidy清理无用包,实现可复现构建与版本精准控制。