今天在写代码时,发现一个结构体使用json.Marshal后值为“null”,最后定位到这个函数
func toString(obj any) string {
if obj == nil {
return ""
}
bytes, _ := json.Marshal(obj)
return string(bytes)
}
经过测试发现
var t []string
fmt.Println(toString1(t))
输出结果
null
经过分析,原因是:
所以:
可以通过debug确认
func main() {
var x any
time.Sleep(1 * time.Second)
var s []string
x = s
time.Sleep(1 * time.Second)
_ = x
}
对sleep处加断点
运行第一个断点处,x变量为
x = {interface{}}nil
运行到第二个断点处,x变量为
x = {interface{}|[]string} []string(nil)
可以看到当复制一个零值的字符串切片时,此时x的类型已经改变
两个方法
此时参数obj是一个切片,传入零值切片后,obj也是零值切片
func toString[T any](obj []T) string {
if obj == nil {
return ""
}
bytes, _ := json.Marshal(obj)
return string(bytes)
}
在函数内部,通过反射,判断obj是否时零值
func toString(obj any) string {
v := reflect.ValueOf(obj)
if v.IsZero() {
return ""
}
if obj == nil {
return ""
}
bytes, _ := json.Marshal(obj)
return string(bytes)
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。