Go语言技术文章
-
本文介绍一种简洁、可读性强且符合Go语言惯用法的重构方案,通过封装带重试机制的连接函数,消除NSQ生产者与消费者初始化中高度相似的循环重试逻辑,避免过度设计,兼顾清晰性与可维护性。363 收藏 -
BuildTags必须写在文件开头且紧挨第一行,因是gobuild提前解析的元指令而非注释;若前面有空行、注释或代码则整行失效,导致本该排除的文件仍参与编译。150 收藏 -
本文介绍在Go中计算目录总大小的正确方法,重点解决全局变量引发的并发安全与代码可维护性问题,推荐使用闭包封装状态,并提供完整可运行示例及关键注意事项。306 收藏 -
Go微服务需自研熔断因hystrix-go已归档且存在性能与竞态问题;应为每个下游服务独立配置gobreaker实例,嵌入HTTP调用链,暴露Prometheus指标,并处理半开状态懒触发特性。349 收藏 -
在使用io.Copy处理大文件(如15–20MBJSON响应)时,若忽略显式关闭输出流,可能导致末尾字节(如JSON的]或})被截断——这并非io.Copy的Bug,而是缓冲区未刷新+资源竞争引发的典型问题。498 收藏 -
Go语言规定,函数内部声明的类型标识符作用域从其类型名出现处开始,而非声明块起始处;因此内层同名类型若声明在字段使用之后,字段仍会绑定外层类型,导致类型不匹配错误。333 收藏 -
http.Redirect是实现302跳转最简方式,自动设状态码与Location头;需用绝对URL,避免重复写头panic;方法保留选307/308;防开放重定向须校验同域;反代下需读X-Forwarded-Proto判断协议。248 收藏 -
本文详解Go语言中处理url.Values(即map[string][]string)的正确方式,重点解决因误用切片导致的unsupportedtype[]stringSQL错误,并提供可扩展、类型安全的表单值提取方案。361 收藏 -
fori,v:=rangeslice中v是副本,修改v不影响原切片;须用users[i].Age=30或&users[i]修改;取&v地址会全部指向最后一次迭代值;map遍历无序,增删键值行为未定义;字符串range返回字节索引,多字节字符需转[]rune处理。105 收藏 -
用net.DialTimeout扫单个端口最简单可靠,超时建议设2s(内网500ms,公网不低于1s),网络类型仅支持"tcp"或"udp",地址格式必须为"host:port";并发扫描需限速,内网建议并发100,公网10~30,用带缓冲channel控制速率。152 收藏 -
debug.PrintStack()可快速打印当前goroutine堆栈,不终止程序但无格式;errors.WithStack()保留原始错误堆栈,适合链式错误;runtime.Caller()手动提取调用信息;pprof可查看所有goroutine全局堆栈。158 收藏 -
GORMAutoMigrate不建表且不报错,因其仅比对结构差异,不校验连接、权限、类型兼容性等;需确保已成功初始化*gorm.DB、structtag正确、MySQL严格模式下类型精确匹配,并用db.Migrator().CurrentDatabase()验证连接。317 收藏 -
recover()捕获panic后需类型断言转为安全错误响应,设HTTP状态码(非一律500),记录日志但不泄露敏感信息,主动关闭连接防HTTP/2复用污染,且每个含复杂逻辑的中间件都应独立deferrecover()。208 收藏 -
GoHTTPhandler返回JSON时须手动设置Content-Type为application/json;结构体字段需大写导出并加jsontag;HTTP状态码仅表协议层结果,业务码应放JSONbody中;读接口可直返业务对象,写接口建议包装。439 收藏 -
map[string]int最直接用于频次统计,支持O(1)操作,但需注意未初始化key的零值覆盖风险;有序场景可用[]int+sort.Search;多维分组推荐struct作key;map遍历顺序随机,需显式排序。155 收藏