-
最小可行Web服务需两行核心代码:注册路由和启动监听;http.ListenAndServe才真正启动服务,端口格式须为":8080",错误须显式处理,GET参数用r.URL.Query().Get(),POST需先调用r.ParseForm()。
-
Go中error是返回值而非异常,需显式处理;应避免嵌套iferr!=nil,优先用%w包装、errors.Is/As判断,HTTP错误需脱敏并结构化处理。
-
优先用pgx.CopyFrom(PostgreSQL)或LOADDATALOCALINFILE(MySQL)批量插入万级数据,避免db.Exec循环;分批事务需动态设阈值,GORM.CreateInBatches非银弹,预校验CSV数据必做。
-
gofix是Go1.0到1.12期间用于自动修复过时API调用的工具,但自Go1.13起已被正式弃用,命令不再可用;现需结合golist-u-mall、goget、govet、gopls快速修复及手动验证完成迁移。
-
gomodinit路径须与最终导入路径一致,推荐直接使用GitHub地址如github.com/username/myapp;cmd/存放main包,internal/存放私有代码且不可被外部import;单模块项目无需go.work;Makefile可统一构建流程,需声明.PHONY。
-
errors.New和fmt.Errorf不带堆栈因其不记录调用位置;需用github.com/pkg/errors的errors.New、errors.Errorf或errors.WithStack显式捕获,且必须用%+v才能打印完整堆栈。
-
Go留言板需前后端分离:后端用net/http实现带校验的提交API(含ParseForm、长度限制、html.EscapeString转义、JSON响应),前端用fetch动态渲染,模板用html/template自动转义,核心是明确转义责任、时间格式控制和错误处理边界。
-
Go实现tail-f需组合fsnotify监听与inode校验:捕获目录事件识别新文件,用os.SameFile确认rotate连续性,每次读前stat校验大小并处理截断,推荐使用nxadm/tail库。
-
channel会阻塞因发送接收未同步:无缓冲需双方就绪,有缓冲在满或空时阻塞。1.无缓冲channel发送阻塞若无接收方;2.用goroutine分离发送接收可避免死锁;3.close(c)通知接收方结束等待;4.select配合default实现非阻塞通信;5.time.After用于超时控制防永久阻塞。
-
Go无内置Observer接口,需手动实现:用map存带唯一ID的回调函数、sync.RWMutex保障并发安全;避免直接用map[interface{}]func();异步通知应启用goroutine并加超时或非阻塞发送以防阻塞。
-
reflect.TypeOf必须接收interface{}参数,因为它直接读取空接口runtime.eface中的_type字段获取类型元数据,而非推断类型;传入具体类型时编译器会自动装箱为临时interface{},而nil因无_type指针导致返回nil。
-
Go1.8+启动HTTPS服务即自动启用HTTP/2,无需额外导入或配置;纯HTTP永远为HTTP/1.1,验证需通过ChromeDevTools查Protocol显示h2或curl-v--http2观察ALPN协商结果。
-
Golang监控网络流量核心是采集→解析→统计→可视化/告警四环节:通过读取/proc/net/文件实现无权限汇总监控,用gopacket抓包做协议级分析,结合/proc/PID/net/关联进程流量,并用Prometheus导出指标供Grafana展示。
-
推荐用map[string]User+struct实现内存用户列表,以ID为键、封装读写锁防并发panic,并优于slice遍历;后续可平滑对接Redis/SQL或JSON持久化。
-
Go变量影子(shadowing)是什么,为什么它危险变量影子是指在内层作用域(比如if、for、func内部)用同名变量重新声明,导致外层同名变量被“遮蔽”。这不是语法错误,Go编译器允许,但极易引发逻辑bug:你以为在改外层变量,实际只改了内层副本。常见错误现象:err在iferr!=nil块里用:=重声明,结果函数返回时用的仍是未赋值的外层err,导致panic或静默失败。使用场景集中在错误处理、循环体、嵌套函数中——尤其是习惯Python/JS的