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

有以下内容:


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) == fifi


ibeautiful
浏览 120回答 2
2回答

阿晨1998

该表达式转换 fi为*int. 结果包含相同的地址,但具有不同的类型。如果将 a*FlexInt传递给json.Unmarshal,则将json.Unmarshal调用*FlexInt.UnmarshalJSON调用的方法json.Unmarshal,依此类推。

噜噜哒

它是相同的指针,但类型不同。当使用包含 a 的json.Unmarshalan 调用时,它会调用的方法。当使用包含 an 的 an调用它时,它使用内置行为。由于和具有相同的基础类型,因此可以将指向一个的指针转换为指向另一个的指针,但这是接口将标记的“实际”类型。interface{}FlexInt*FlexIntUnmarshalJSONinterface{}int*FlexIntint
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go