-
Go中通过表驱动测试实现参数化,使用切片定义输入和期望输出,结合t.Run命名子测试,便于定位问题并提升可维护性。
-
Go语言的testing包用于编写单元和基准测试,无需第三方库。测试文件需以_test.go结尾,测试函数以Test开头并接收testing.T参数,如TestAdd(ttesting.T)。运行gotest执行测试,-v显示详情,-run=匹配特定测试,./...覆盖子目录。推荐表驱动测试,用切片定义多组用例并通过t.Run执行子测试。基准测试函数以Benchmark开头,接收testing.B,如BenchmarkAdd(btesting.B),循环执行以测量性能。
-
Go中接口类型不可取地址,但可通过指针接收者实现接口以支持原地修改,或用函数类型封装接口实现动态调用,反射仅作特殊场景备选。
-
Go的fmt.Scan默认以空白字符分隔,只能读取单个单词;要完整读取含空格的整行输入(如“HelloWorld”),需使用bufio.NewReader(os.Stdin)配合ReadString('\n')。
-
基准测试需由gotest自动多次迭代(b.N)以获取稳定统计值;其本质是通过足够重复执行抵消系统抖动等干扰,获得可信的ns/op和allocs/op,单次执行因CPU频率突变、GC触发等因素偏差大不可信;b.N由testing包动态调整至总耗时≥1秒。
-
slice的pointer指向底层数组的起始元素地址,多个slice可共享同一数组内存,修改可能相互影响;append扩容时pointer会指向新数组,导致脱离原数组;传参时pointer被复制但仍指向原数组,修改会影响原始数据。
-
用gRPC替代HTTP/1.1JSONAPI是最直接的降延迟手段,因其基于HTTP/2和ProtocolBuffers,具备二进制序列化快、多路复用、头部压缩等优势,实测可降低RTT2–5ms。
-
UDP无连接,Go中DialUDP仅绑定默认远端地址便于Write,而WriteToUDP才符合UDP本质;固定目标用DialUDP,动态目标必须用ListenUDP+WriteToUDP;接收须用ReadFromUDP,且所有可靠性机制需自行实现。
-
用docker-compose搭Go微服务实验环境最稳,通过独立Dockerfile(alpine基础镜像)、服务名互调(Docker内置DNS)、环境变量传地址、0.0.0.0监听、重试逻辑及合理日志调试,避免端口冲突与“本地能跑”问题。
-
Go1.11起官方推荐使用GoModules替代dep等工具,通过gomod命令直接管理依赖;需Go≥1.11(建议≥1.16),初始化用gomodinit,自动下载依赖并生成go.mod/go.sum,常用命令包括goget、gomodtidy、golist等。
-
unsafe.Pointer(uintptr(x))不是整数转指针的正确方式,因其将uintptr(GC不追踪的整数)误作指针使用,易致悬垂指针、崩溃或脏数据;唯一安全用法是即时中转:unsafe.Pointer→uintptr→unsafe.Pointer,且中间不可存变量、不可跨函数或goroutine。
-
函数用于通用任务,如add(3,5);方法绑定类型,如Person的Greet();依据场景选函数或方法,结合闭包提升灵活性。
-
Go不支持Git子模块自动解析,需手动初始化子模块并用replace绑定本地路径,否则导入失败;CI需配置递归拉取子模块,否则构建静默失败。
-
非缓冲channel用于同步通信,适合精确协调场景;缓冲channel提供异步解耦,适用于应对生产消费速度不匹配。选择依据是goroutine协作模式:需“手递手”交接用非缓冲,可“丢进队列”用缓冲,控制消息用非缓冲,数据流用缓冲。
-
os.Getenv读不到环境变量主因是启动方式导致环境未继承:终端直接执行可读export变量,nohup/systemd需显式配置,IDE需勾选继承选项。