-
使用testify可封装实现类链式断言。通过自定义AssertionChain结构体包装assert.Assertions,使断言方法调用更连贯,提升测试代码可读性,但非真正链式语法。
-
os.Create本质调用open(2)以O_CREAT|O_WRONLY|O_TRUNC模式打开文件,会清空已有内容、权限固定为0666&^umask,不支持自定义模式或权限,应优先使用os.OpenFile实现精确控制。
-
sync.Map在并发缓存中提供了开箱即用的并发安全实现,其通过内部维护只读和脏两个视图,实现了无锁读取和减少锁竞争,适用于读多写少的场景。相比之下,传统map加sync.Mutex需要手动管理锁,所有操作均需获取锁,性能较低。1.sync.Map优化了大量并发读取的性能,因为大多数操作无需锁;2.它适合写入不频繁、迭代需求少的场景;3.但在写密集或需完整遍历的情况下,传统map加锁可能更高效。因此,sync.Map是特定并发模式下的优化方案,而非通用替代品。
-
最简单方法是用fmt.Printf的%x或%X动词打印字节切片:"%x"输出小写无空格(如00010203),"%x"加空格更易读(如00010203);需偏移地址则手动循环;调试推荐hex.Dump,格式类似tcpdump。
-
用docker-go连不上本地DockerDaemon时需显式指定host,Linux用unix:///var/run/docker.sock,Mac用unix:///Users/$USER/.docker/run/docker.sock,WSL2用tcp://localhost:2375并开启DockerDesktop相应设置。
-
在Go中定义返回时间的函数时,应直接返回time.Time类型而非字符串——这既符合类型安全原则,又能完整保留时间的语义能力(如比较、加减、格式化等),便于后续调用方灵活使用。
-
Go语言中,interface{}与反射结合可在运行时处理任意类型。通过reflect.ValueOf和TypeOf获取类型与值信息,利用Elem()解指针并调用Set修改数据;遍历结构体字段读取标签实现序列化等通用逻辑;通过MethodByName动态调用方法,支持插件式设计。示例包括修改指针指向值、解析structtag及调用导出方法。需注意仅导出字段和方法可被反射操作,且应避免滥用以减少性能开销和维护难度。
-
interface{}会让变量逃逸到堆上,因编译器无法确定底层类型大小和生命周期,保守地将原值复制到堆;常见于传给fmt.Println、json.Marshal等接受interface{}的函数。
-
Go中不能直接用reflect.Method调用结构体方法,因其仅为元信息;须通过reflect.Value.MethodByName()获取可调用的reflect.Value后调用Call(),且仅支持导出方法和可寻址接收者。
-
用time.Truncate(24*time.Hour)最快获取本地时区今日零点,如需指定时区(如Asia/Shanghai)则先In()再Truncate;切勿缓存零点值,应每次实时计算或封装函数。
-
单调栈典型写法是用切片模拟:入栈前弹出破坏单调性的元素,栈顶为切片末尾;升序栈遇更小值持续pop,降序栈遇更大值持续pop;栈中存下标便于计算距离;切片比container/list快3–5倍因连续内存访问。
-
JSON解码失败时,json.Unmarshal统一返回json.UnmarshalTypeError或json.SyntaxError,最常见的是json.UnmarshalTypeError;字段缺失本身不报错,需手动校验。
-
gotoolpprof导出火焰图需用-raw-lines参数生成折叠栈格式:gotoolpprof-raw-lines./myappcpu.pprof>stacks.txt;必须禁用strip,确保符号完整;再用flamegraph.pl渲染为SVG。
-
Go中iferr!=nil是核心控制流而非语法糖,需显式处理每个错误分支;避免err变量覆盖、缩进嵌套和字符串匹配错误;用errors.Is/As判断错误类型;panic仅用于真正不可恢复的初始化失败等场景。
-
http.Post默认不设Content-Type,JSON会被当text/plain导致415错误;须用http.NewRequest+Do并设application/json;json.Marshal错误不可忽略;结构体需jsontag;禁用手写JSON字符串;必须显式设超时。