Go语言技术文章
-
围绕 Go net.Conn 写入超时排查一个常见误区:SetWriteDeadline 只约束当前连接的 I/O 截止时间,还要正确处理 n、err、缓冲写入和连接复用,才能判断请求是否真正收口。501 收藏 -
Go 1.22 引入的 base64.Encoding.AppendEncode 会把编码结果追加到已有 dst,而不是要求调用方先单独分配输出切片。本文用请求令牌拼接场景拆开 dst 前缀、EncodedLen 容量预估、append 扩容和输入边界,给出可核对的最小写法。501 收藏 -
用 httptrace.ClientTrace 的 GotConnInfo 判断 Go HTTP 请求拿到的是新连接还是曾经使用过的连接,并区分 WasIdle、IdleTime 与请求体关闭时机。501 收藏 -
netip.Prefix.Contains 判断网段时,结果异常通常不是位运算错了,而是 IPv4 与 IPv6 地址族、未规范化前缀或无效掩码混在了一起。本文用最小代码复现这些边界,并给出稳定的解析、规范化和测试方法。501 收藏 -
Golang · Go问答 | 1个月前 | go · 性能 · bufio · 错误排查 · 分块读取 Go bufio.Scanner token too long Scanner.Buffer 大日志行
Go 用 bufio.Scanner 逐行读取日志时,遇到超长 JSON 行会返回 token too long。本文用可复现实验比较默认上限、Scanner.Buffer 和 bufio.Reader 分块读取的内存与吞吐边界,给出线上日志处理的选择方法。501 收藏 -
本文用 Go 泛型实现切片保序去重,并进一步扩展到结构体按字段去重,讲清 comparable 约束、seen map、首条保留和常见边界处理。501 收藏 -
结构体指针赋值后字段没变,是因为误将指针变量重新赋值(如p=&User{...}),未解引用修改原内存;正确做法是用p.Name="new"或(*p).Name="new"。501 收藏 -
Go的Benchmark函数须以Benchmark开头、接收*testing.B参数,并在b.N循环中执行逻辑;框架自动调优b.N使总耗时≥1秒,需用b.ResetTimer()分离初始化开销。501 收藏 -
Go无内置图结构,需按需组合基础类型实现邻接表、邻接矩阵或结构体封装;DFS/BFS须手动管理visited状态;Dijkstra需防溢出与负权;并发优化应重workerpool而非盲目goroutine。501 收藏 -
首先定义任务结构体并通过channel传递任务,创建带缓冲的channel存放任务;然后启动多个工作协程从channel中并发读取并执行任务,直至channel关闭,实现高效的任务分发与调度。501 收藏 -
结论:用reflect.Value.Interface()再类型断言比反复调用reflect.Value方法快,但仍比原生访问慢5–7倍;重复reflect.ValueOf()+Interface()会叠加开销。501 收藏 -
Go敏感词过滤核心是防漏、防错、高并发稳定;DFA(前缀树)最实用,但需注意isEnd赋值位置、区分isEnd/isPrefix、用rune遍历、支持多匹配回溯、初始化childrenmap、中文替换用[]rune计数。501 收藏 -
购物车数据应存Redis而非Session;Session仅存user_id用于身份识别,购物车用cart:{user_id}为key存RedisHash结构,支持原子增删、跨设备合并与扩容。501 收藏 -
Go中HTTP中间件通过func(http.Handler)http.Handler实现链式装饰,需用http.HandlerFunc转换并调用next.ServeHTTP;结构体嵌入适合带状态配置的场景,函数包装适用于单一职责,二者均须确保上下文与错误正确传递。501 收藏 -
net.Conn.Read卡住但不报错,主因是对端未发数据、TCP窗口为0或本地缓冲区满;需设ReadDeadline、查Recv-Q、用gotooltrace分析IOwait态。501 收藏