Go语言技术文章
-
Go unsafe.Slice 的长度参数是元素数,不是 C 缓冲区字节数。本文用 cgo 示例说明如何校验指针、换算长度、维持 C 内存生命周期,并避开布局和 Go 指针陷阱。495 收藏 -
Golang · Go问答 | 2星期前 | 基准测试 · Go问答 · Go string []byte map key Go map key 分配 string 转 []byte 性能 Go AllocsPerRun Go map 性能评估
Go 的 []byte 不能直接作为 map key。本文拆分 string 转换、map 查找和写入三个成本,用 AllocsPerRun 与基准测试建立可复用的分配评估方法。137 收藏 -
Go 1.22 引入 reflect.TypeFor 后,泛型函数可以直接拿到类型参数 T 对应的 reflect.Type。本文用一个小型类型描述器说明 TypeFor、TypeOf、Kind 和 Implements 的边界。479 收藏 -
Golang · Go问答 | 2星期前 | String · unicode · utf-8 · Go问答 · Go []rune转字符串 Go字符串长度 Go rune长度 Go UTF-8长度 utf8.RuneCountInString
Go 中 []rune 转回 string 后长度变化,通常是因为 len(string) 统计 UTF-8 字节而不是 Unicode code point。本文用原创示例拆开三种长度口径,并给出有效性检查与场景选择方法。428 收藏 -
reflect.Value.IsZero 判断的是类型零值,time.Time.IsZero 判断的是零时间点。本文拆开值、指针和接口字段的反射入口,给出避免时间字段误判的写法与检查清单。138 收藏 -
Go 字符串按字节截断后出现替换符,通常是切进了 UTF-8 多字节序列。本文解释 U+FFFD 的来源,并分别给出安全字节截断、rune 截断和更高层字符边界的判断方法。372 收藏 -
Go 反射中 reflect.Value.CanSet 返回 false 时,先用 CanAddr 区分不可寻址的值副本,再用 CanInterface 和字段导出状态识别只读字段;本文给出指针、Elem、字段诊断和安全修复示例。361 收藏 -
Go map 的 range 顺序不保证稳定。本文用排序后的键值表示和顺序无关断言,说明如何写出可重复、能覆盖边界的 map 测试。352 收藏 -
Go 的 map 参数仍然按值传递,但参数副本与调用者共享底层数据,所以修改键值会被调用者看到;重新绑定参数则不会替换调用者的 map。300 收藏 -
Go 的 iter.Pull2 把 Seq2 转成 next/stop 拉取接口。本文用一个可复用示例说明提前 break 时为什么必须调用 stop,以及 defer stop()、ok 判断和并发边界怎么处理。165 收藏 -
Go 的 nil map 读取会返回元素零值,但写入会触发 panic。本文用可复现的判断方式拆开读取、ok 值、len、make 和嵌套 map 的边界,给出稳定修复方案。318 收藏 -
用 iter.Seq2[int, error] 同时传出行号和校验错误,说明 range、yield、continue 与 break 的边界,以及 Go 1.23 语言版本要求。140 收藏 -
Go 的三索引切片 a[low:high:max] 会把结果容量固定为 max-low。把 data[:len(data):len(data)] 传给下游后,append 无法复用调用方的额外容量,但已有元素仍可被修改。245 收藏 -
cmp.Or 会把类型零值视为‘没有候选’,适合简单回退,却无法仅凭值区分未提供和显式传入的 0、false 或空字符串。本文用配置示例说明原因,并给出指针存在性方案。182 收藏 -
Go copy 支持源切片与目的切片重叠。本文用区间和示例说明复制方向、返回值、插入删除写法,以及长度、容量和并发边界。210 收藏