为了账号安全,请及时绑定邮箱和手机立即绑定

Go:如何将 float32 指针转换为 float64 指针

Go:如何将 float32 指针转换为 float64 指针

Go
慕码人2483693 2023-03-15 13:53:42
如何将 float32 指针转换*float32为 float64 指针*float64。package mainimport "fmt"func main() {    var value *float32    v := float64(*value)    vp := &v    fmt.Println(vp)}以下代码返回运行时错误:无效的内存地址或 nil 指针取消引用
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您的代码失败的原因很简单,就是您试图取消引用尚未初始化的指针:


    var value *float32 

声明一个指向 a 的指针float32,但不对其进行初始化,从而得到一个nil指针。


    v := float64(*value)

然后尝试取消引用value,但正如我们刚刚确定的那样,value它nil没有指向任何东西,因此询问它指向的内容必然会导致错误。


但是,您的代码实际上很好,只要您有一个*float32实际上指向 a 的代码float32,如果我们添加一个实际float32变量并初始化value以指向它,我们就可以看到它:


package main


import "fmt"


func main() {

    var vv float32 = 3.14159

    var value *float32 = &vv

    v := float64(*value)

    vp := &v

    fmt.Println(vp)

}

这将输出值的地址float64。


但是,请注意 afloat64不仅仅是float32占用两倍字节数的 a。精度和内部表示不同,进一步修改代码可以看出:


func main() {

    var vv float32 = 3.14159

    var value *float32 = &vv

    v := float64(*value)

    fmt.Println(vv)

    fmt.Println(v)

}

您应该看到类似于以下内容的输出:


3.14159

3.141590118408203

float64这不是错误,这是vs的不同内部表示的结果float32。


无法保证这些不同类型中的值完全相同 - 每个类型都具有使某些值在字面上无法表示的特征,因此无法保证float32(v) == float64(v)每个v.


这也是为什么您不能简单地对指针进行类型转换的原因:


    vp := *float64(value)

这是非法的,因为指向 a 的指针float64指向的东西与指向 a 的指针根本不同float32。


相比之下,您可以简单地将 a 类型转换*int32为 a *int64。


查看完整回答
反对 回复 2023-03-15
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

一种方法是编写一个函数来安全地将 float32 指针转换为 float64 指针。


package main


import "fmt"


func main() {

    var value *float32

    v := float32ToFloat64(value)

    fmt.Println(v)


    val := float32(1.2)

    p := float32ToFloat64(&val)

    fmt.Println(*p)

}


func float32ToFloat64(value *float32) *float64 {

    if value == nil {

        return nil

    }

    v := float64(*value)

    return &v

}


查看完整回答
反对 回复 2023-03-15
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信