开始玩golang
,并且正在查看自定义json.Unmarshal
。在博客文章中具有以下内容:
type FlexInt int
func (fi *FlexInt) UnmarshalJSON(data []byte) error {
if data[0] != '"' {
return json.Unmarshal(data, (*int)(fi))
}
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
i, err := strconv.Atoi(s)
if err != nil {
return err
}
*fi = FlexInt(i)
return nil
}
我了解它在做什么-但我不了解(*int)(fi)
部分。查看fi
指针的值,它与(*int)(fi)
-(*int)(fi) == fi
相同。但是,当我将该行更改为简单的fi
时,它就会进行无限循环
答案 0 :(得分:2)
表达式converts fi
到*int
。结果包含相同的地址,但类型不同。
如果将*FlexInt
传递给json.Unmarshal
,则json.Unmarshal
将调用*FlexInt.UnmarshalJSON
方法,该方法将调用json.Unmarshal
,依此类推。
答案 1 :(得分:2)
它是相同的指针,但类型不同。当使用包含json.Unmarshal
的{{1}}调用interface{}
时,它将调用FlexInt*
的{{1}}方法。当使用包含FlexInt
的{{1}}进行调用时,它将使用内置行为。由于UnmarshalJSON
和interface{}
具有相同的基础类型,因此可以将指向一个的指针转换为指向另一个的指针,但是接口将被标记为“实际”类型。>