Go语言技术文章
-
Go 切片 append 后另一个切片内容跟着变化,通常是因为容量足够时仍共享底层数组。本文用 len、cap 和最小示例区分共享与扩容分支,并给出 copy 与 slices.Clone 的隔离写法。489 收藏 -
Go 中 len 统计 UTF-8 字节数,utf8.RuneCountInString 统计 rune 数量。本文结合有效性检查和截断场景,说明两者结果不同的原因及选择方法。393 收藏 -
Go 的 map 遍历顺序没有语言规范保证,不能直接把 range 结果写进固定断言。本文用独立 key 切片排序的方法生成稳定输出,并说明 nil map、遍历期间修改和生产代码边界。167 收藏 -
用 Go regexp 的命名捕获组解析日志字段,按 SubexpNames 建立索引映射到结构体,并处理匹配失败、空组和重复组名。434 收藏 -
Go 的 map 读取不存在的键时不会报错,而是返回元素类型的零值。本文用具体代码解释单值读取、comma-ok、nil map 与写入 panic 的边界。482 收藏 -
Go 1.22 引入的 cmp.Or 可以从命令行、环境变量、配置文件和默认值中按顺序取首个非零值。本文用多层配置示例说明泛型约束、零值语义、布尔开关和表达式求值边界。236 收藏 -
Go 方法表达式 T.M 与方法值 x.M 的差别不在语法表面,而在接收者何时绑定。本文用值接收者和指针接收者示例说明函数类型、状态变化与回调选择。370 收藏 -
maps.Copy 只负责把源 map 的键值写入目标 map,不会替 nil 目标分配存储。本文解释 nil map 的读写边界、make 初始化方式,以及函数内初始化后如何返回可写 map。108 收藏 -
Go 空接口断言失败通常不是值看起来不对,而是动态类型与目标类型不完全一致。本文用 %T、comma-ok、类型 switch 区分值类型、指针类型和 typed nil。432 收藏 -
Go 1.23 的 maps.Keys 返回 iter.Seq 而不是切片。本文演示如何用计数和 break 获取任意前 N 个键,何时必须排序保证稳定顺序,以及如何封装可组合的 Take 迭代器。364 收藏 -
Go 接口类型本身支持比较,但接口里的动态值如果是 slice、map、func,或包含这些字段的数组和结构体,比较相同动态类型的两个接口就可能触发 panic。本文说明判断边界,并给出 reflect.Value.Comparable、reflect.DeepEqual 和类型化比较的选择方法。481 收藏 -
Go slices.Clip 会把切片容量收紧到长度,但不会复制元素或立即释放底层数组。本文从三索引切片、append 隔离、长期持有和 Clone 对比四个场景说明什么时候值得调用。263 收藏 -
Go defer 会不会覆盖显式 return,关键不在 return 写没写值,而在 defer 是否能访问函数的命名结果参数。本文用执行顺序、闭包捕获和 defer 参数求值三个角度拆开这个常见误区。485 收藏 -
讲清 Go slices.Delete 删除后 len、cap、尾部清零和底层数组持有之间的区别,并给出 Delete、Clip 与复制收缩的选择方法。241 收藏 -
Go defer 不是把整条语句留到函数结束才解释:函数值和参数在登记时求值,真正调用在返回前发生。本文拆开值参数、闭包和命名返回值的时机差异。120 收藏