登录
首页 >  Golang >  Go问答

Golang 地址运算符与指针类型转换语法

来源:stackoverflow

时间:2024-02-28 08:09:24 181浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang 地址运算符与指针类型转换语法》,聊聊,我们一起来看看吧!

问题内容

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


解决方案


将表达式 converts fi 转换为 *int。结果包含相同的地址,但具有不同的类型。

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

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

本篇关于《Golang 地址运算符与指针类型转换语法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>