Golang地址运算符和(* int)(Type)语法

时间:2019-07-11 19:26:00

标签: go

开始玩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时,它就会进行无限循环

2 个答案:

答案 0 :(得分:2)

表达式converts fi*int。结果包含相同的地址,但类型不同。

如果将*FlexInt传递给json.Unmarshal,则json.Unmarshal将调用*FlexInt.UnmarshalJSON方法,该方法将调用json.Unmarshal,依此类推。

答案 1 :(得分:2)

它是相同的指针,但类型不同。当使用包含json.Unmarshal的{​​{1}}调用interface{}时,它将调用FlexInt*的{​​{1}}方法。当使用包含FlexInt的{​​{1}}进行调用时,它将使用内置行为。由于UnmarshalJSONinterface{}具有相同的基础类型,因此可以将指向一个的指针转换为指向另一个的指针,但是接口将被标记为“实际”类型。