-
本文详解如何在Go应用启动时,不依赖预设数据库名,通过database/sql和go-sql-driver/mysql动态创建MySQL数据库及表结构,解决连接字符串强制要求dbname的常见痛点。
-
Go中访问结构体字段统一用.,无论变量是指针还是值;编译器自动解引用指针,无->操作符;nil指针调用.会panic;修改字段或避免大结构体复制时需指针接收者;取字段地址要求结构体本身可寻址。
-
gopacket收不到包主因是网卡未启混杂模式或权限不足:Linux需sudo或setcap,macOS须sudo且pfctl放行,Windows依赖Npcap并用正确设备名;过滤SYN须在OpenLive时设BPF表达式,解析需用Layer方法而非硬索引。
-
结构体字段顺序直接影响内存占用:Go按声明顺序布局字段并插入padding以满足对齐要求,大字段前置、同类型聚集可减少padding;对齐值由字段自身决定(最大8),嵌套结构体的尾部padding会传染至外层;需用工具检测静默浪费。
-
将Golang服务日志输出到stdout并采用JSON格式,结合FluentBit等采集工具与Kubernetes环境对接,可实现高效统一的日志收集。1.推荐将日志写入stdout/stderr,避免本地文件存储导致的丢失问题,便于Docker和Kubernetes通过默认日志驱动捕获。2.使用结构化日志(如zap生成的JSON)提升可读性和检索效率,自动适配ELK、Loki等系统。3.在K8s中部署FluentBitDaemonSet,从容器运行时目录读取日志,添加Pod元数据标签,实现精准路由与过滤。
-
Go标准库log包默认不带时间戳、无级别区分、输出固定到stderr且不可重定向,因此不适合生产环境;需显式创建自定义logger并设置flag和输出目标,或封装带级别的结构体。
-
Go1.13起默认启用GOPROXY,依赖下载加速依赖代理(如goproxy.cn)与本地模块缓存($GOPATH/pkg/mod),首次下载后复用本地缓存,配合CI/CD持久化或私有Proxy实现高效复用。
-
不能直接用net/http暴露服务到公网,因存在连接泛洪、Slowloris攻击、TLS卸载缺失、HTTP/2支持不全等安全与功能缺陷;必须通过Nginx作为反向代理承担网络边界职责,并正确配置超时、Header透传、WebSocket支持及真实IP解析。
-
robfig/cron/v3是Go中启动最简定时任务的常用方案,需显式调用Start()、注意秒级精度需WithSeconds()且表达式匹配段数,解析失败易静默忽略,不适用于高精度或大量任务。
-
goleak.VerifyNone(t)必须用defer包裹在测试函数末尾,否则panic或提前return时不会执行;子测试需单独加defer;手动启动的http.Server需显式忽略;channel泄漏占90%,需严控close时机与nil/重复close;线上用pprof定位泄漏;测试阶段应结合-race、context和runtime.NumGoroutine()预防。
-
本文介绍如何在Go中通过预过滤机制,避免将空嵌入结构体(如Problem{})序列化为JSON中的空对象{},从而实现任意组合非空结构体并生成紧凑、合规的JSON数组。
-
Go切片传参时传递的是包含ptr、len、cap的结构体副本,ptr值被复制但指向同一底层数组;修改元素生效,append等操作需返回新切片才能影响调用方。
-
不能直接将reflect.Value转为reflect.Type,只能通过v.Type()提取其绑定的类型;reflect.Type无法反向生成reflect.Value,需用reflect.New(t).Elem()创建新值。
-
json-iterator更快是因为绕过反射、预编译解析逻辑、支持零拷贝字符串读取,但仅在结构体稳定、字段固定且高频解析场景下优势显著;动态map或深层interface会削弱性能,甚至更慢。
-
Go标准库log不支持日志轮转,需用第三方库:lumberjack适合按大小轮转(如100MB/个,保留7个+28天),file-rotatelogs适合按日期轮转(如daily,带软链和精确时间控制)。