-
http.Request.Close是一个已弃用的HTTP/1.1连接控制字段,不参与并发安全机制;http.Request本身并非并发安全类型,无论Close设为true或false,都不影响并发请求处理——但若在多goroutine中共享或修改同一*http.Request实例,则行为未定义,属编程错误。
-
本文详解如何在Go中利用反射安全地为任意结构体字段动态赋值,避免类型断言硬编码,强调必须传入结构体指针并正确处理反射值层级。
-
Go命令行工具用flag包即可高效开发,但需注意:必须调用flag.Parse()才能生效;子命令宜用独立FlagSet;String与StringVar按意图选用;禁用CGO并加-ldflags="-s-w"可大幅减小体积。
-
Go二进制默认静态链接、零外部依赖,但需警惕隐性环境依赖:cgo启用、外部命令调用、硬编码系统路径、TLS证书查找、DNS解析及嵌入资源管理。
-
JWT中间件需显式校验token.Valid,用ParseWithClaims解析自定义Claims,正确提取BearerToken并防护空值,存取用户ID应类型安全断言,时间戳须用秒级int64。
-
Go变量声明仅三种合法方式:包级变量、接口字段、显式类型控制或延迟赋值必须用var;:=仅限函数内且需至少一个新变量;var()块支持批量声明、注释与零值可控。
-
Go中定义接收任意多个字符串的变长函数需用funcname(args...string)语法,...string必须位于参数列表末尾,args在函数内为普通[]string切片,调用时可传零个、多个字面量或加...展开的切片。
-
Go标准库net/http足以构建轻量可靠的RESTfulAPI;应使用http.ServeMux路由、统一路径风格、正确设置Content-Type与状态码、封装JSON响应、复用标准错误处理、全程传递context控制超时。
-
直接用chaninterface{}做Pub/Sub会卡死,因Gochannel默认同步,无接收者时发送阻塞;缓冲channel溢出仍阻塞,且无法动态管理订阅者;正确做法是用select+default非阻塞发送或goroutine封装。
-
reflect包可动态调用方法,需通过reflect.ValueOf获取值对象;2.使用MethodByName查找导出方法并验证有效性;3.参数须用reflect.ValueOf封装且类型匹配;4.调用Call传入参数切片并处理多返回值;5.最后一个返回值常为error,需判断是否nil;6.非导出方法无法调用,受访问控制限制;7.反射强大但影响性能,应谨慎使用。
-
Go的time.Sleep基于绝对时间调度,当系统时间被人为大幅回拨(如倒退一天),Sleep可能长时间阻塞——这不是bug,而是设计使然,源于对调度精度与时钟单调性的权衡。
-
Gostruct不支持声明时设默认值,需用NewXXX构造函数显式初始化字段;指针字段可延迟设默认值;第三方反射库有性能和维护风险。
-
Command接口必须显式定义Execute、Undo、Redo三个方法,确保语义正确;历史栈应存命令快照而非指针,避免状态污染和内存泄漏;Undo/Redo需配合canUndo/canRedo校验与currentIndex跟踪以保证原子性;副作用须剥离至Command外层。
-
闭包在Go语言中强大且易误用。1)闭包捕捉环境变量,需理解其生命周期以防内存泄漏。2)使用立即执行函数可避免闭包捕获变量引用误区。3)闭包可修改外部变量,需注意多goroutine下的竞态条件。
-
bufio.Scanner默认缓存整行易致内存爆炸,遇超长行或大文件可能触发ErrTooLong或OOM;适合行短可控文本,非GB级日志场景;若必须使用,应先调用scanner.Buffer(make([]byte,64*1024),1<<31)。