type Data struct {
V int `json:"v"`
}
func TestToJSONString(t *testing.T) {
a := assert.New(t)
a.Equal("", ToJSONString(nil))
var data *Data
a.Equal("", ToJSONString(data))
var k *int
a.Equal("", ToJSONString(k))
}
var a *int = nilvar b interface{} = nil
fmt.Printf("a=(%T, %v)\n", a, a)
fmt.Printf("b=(%T, %v)\n", b, b)
fmt.Println("a == nil:", a == nil)
fmt.Println("b == nil:", b == nil)
fmt.Println("a == b:", a == b)
var a *int = nilvar b interface{} = a
fmt.Printf("a=(%T, %v)\n", a, a) // a=(*int, <nil>)
fmt.Printf("b=(%T, %v)\n", b, b) // b=(*int, <nil>)
fmt.Println("a == nil:", a == nil) // a == nil: true
fmt.Println("b == nil:", b == nil) // b == nil: false
fmt.Println("a == b:", a == b) // a == b: true
现在我们再来看b==nil这段代码会发现明朗许多:
b == nil // 等价于:(*int, nil) == (nil, nil)
这里可能会疑惑,为什么等式右侧的 nil,其 type 为 nil 呢?这是因为当 b 指定为 interface{} 类型的时候,无法确定其真实的类型,随着程序的运行,其类型可能会不断改变,所以其类型默认为 nil。更进一步,我们可以看一个硬编码的数字是如何进行比较判断的。数字会根据上下文来推断自己的类型,一个具体的例子如下:
var a int = 12var b float64 = 12var c interface{} = a
fmt.Println("a==12:", a == 12) // true => (int, 12) == (int, 12)
fmt.Println("b==12:", b == 12) // true => (float64, 12) == (float64, 12)
fmt.Println("c==12:", c == 12) // true => (int, 12) == (int, 12)
fmt.Println("a==c:", a == c) // true => (int, 12) == (int, 12)
fmt.Println("b==c:", b == c) // false => (float64, 12) == (int, 12)
var b float64 = 12var c interface{} = b
fmt.Println("c==12:", c == 12) // c==12: false
fmt.Printf("c=(%T,%v)\n", c, c) // c=(float64,12)
fmt.Printf("hard-coded=(%T,%v)\n", 12, 12) // hard-coded=(int,12)
回到最开始的 nil 判断,让我们回到最开始出现问题的代码,现在再来看会清晰许多
funcToJSONString(i interface{})string {
if i == nil {
return""
}
bytes, _ := json.Marshal(i)
returnstring(bytes)
}
funcTestToJSONString() {
// ...var data *Data
a.Equal("", ToJSONString(data))
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具