-
Go中处理JSON字段缺失应根据场景选择方法:简单可选字段用指针(如*string),可判断nil;需区分“缺失”与“null”用map[string]json.RawMessage;复杂逻辑实现自定义UnmarshalJSON;动态解析可选gjson或mapstructure库。
-
最稳妥的HTTP302重定向需显式传入http.StatusFound状态码并使用绝对URL;避免已写响应体后调用,手动设置Location头时须先设头再调用WriteHeader,带参URL应通过url.URL和url.Values安全构造。
-
泛型是编译期类型抽象,反射是运行时类型探查;选哪个取决于编译时是否已知类型:泛型零开销但无法处理动态类型,反射灵活但有性能与安全代价,二者在需编译期约束+运行时结构分析时必须协同使用。
-
该用指针传参当结构体大于16字节、需修改原值、含引用类型字段或方法需指针接收者;小结构体(如time.Time)值传参更优;slice/map本身是引用描述符,通常无需指针;逃逸分析比指针/值选择更关键。
-
传入结构体变量得只读副本,须传指针再调用.Elem()才能写入;未导出字段不可读,仅能判断可访问性;Type用于元信息,Value用于读写;嵌套字段需递归处理;遍历前须确认结构体类型并用.NumField(),索引从0开始。
-
Go项目依赖来源取决于模块引入方式及环境配置,核心命令是golist-m:all显示全部模块及其来源(含replace/indirect标记),-json输出含Dir/Replace/Indirect字段,结合GOPROXY/GOPRIVATE决定实际下载地址。
-
用reflect.TypeOf获取类型再调用NumMethod()可得导出方法数,仅含直接定义的方法;遍历用Method(i),注意接收者类型匹配及接口方法Func无效。
-
gowork是Go1.18引入的多模块工作区管理机制,必须用于同一仓库中多个独立go.mod模块(如api/、core/、cli/)需相互引用、统一构建或调试的场景,否则会因“modulenotinmainmodule”报错。
-
传入结构体变量得只读副本,须传指针再调用.Elem()才能写入;未导出字段不可读,仅能判断可访问性;Type用于元信息,Value用于读写;嵌套字段需递归处理;遍历前须确认结构体类型并用.NumField(),索引从0开始。
-
反射无法修改未导出字段。标准情况下,reflect.Value的CanSet()返回false,赋值会panic;虽可通过unsafe.Pointer等手段绕过,但属非安全操作,破坏封装性,引发状态错乱、兼容性问题及安全风险,仅限底层库或调试使用。应通过公开Setter、接口抽象或tag标记等设计替代,确保代码健壮性。
-
Go的pprof默认以采样时间(duration)统计性能热点,但可通过gotoolpprof-callgrind将CPUprofile转换为Callgrind格式,从而获取精确的函数调用次数(hitcount),适用于深度分析调用频次与热点路径。
-
使用bufio.Scanner可高效逐行读取文件。先用os.Open打开文件并创建Scanner,通过forscanner.Scan()循环读取每行内容,scanner.Text()获取字符串,结束后检查scanner.Err()确保无I/O错误;若处理超长行,需调用scanner.Buffer设置更大缓冲区,如1MB,以避免报错。该方法适合大文件或按行解析场景。
-
本文介绍在Go泛型正式支持前,如何通过代码生成(gogenerate)技术实现类型保留的错误检查包装函数,避免使用interface{}导致的类型丢失问题,兼顾安全性与简洁性。
-
Gosort包排序需显式指定规则:整数切片用sort.Ints;自定义类型须实现sort.Interface三方法;sort.Slice支持闭包但不稳定,sort.SliceStable才稳定且更推荐。
-
本文详解Go中切片虽含底层指针,但本质是值类型;因此修改其长度/容量(如调用append)必须使用指针接收器或返回新切片,否则原变量不会更新。