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

如何将 float32 指针转换*float32为 float64 指针*float64。


package main


import "fmt"


func main() {

    var value *float32

    v := float64(*value)

    vp := &v

    fmt.Println(vp)

}

以下代码返回


运行时错误:无效的内存地址或 nil 指针取消引用


慕码人2483693
浏览 92回答 2
2回答

慕莱坞森

您的代码失败的原因很简单,就是您试图取消引用尚未初始化的指针:    var value *float32 声明一个指向 a 的指针float32,但不对其进行初始化,从而得到一个nil指针。    v := float64(*value)然后尝试取消引用value,但正如我们刚刚确定的那样,value它nil没有指向任何东西,因此询问它指向的内容必然会导致错误。但是,您的代码实际上很好,只要您有一个*float32实际上指向 a 的代码float32,如果我们添加一个实际float32变量并初始化value以指向它,我们就可以看到它:package mainimport "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.141593.141590118408203float64这不是错误,这是vs的不同内部表示的结果float32。无法保证这些不同类型中的值完全相同 - 每个类型都具有使某些值在字面上无法表示的特征,因此无法保证float32(v) == float64(v)每个v.这也是为什么您不能简单地对指针进行类型转换的原因:    vp := *float64(value)这是非法的,因为指向 a 的指针float64指向的东西与指向 a 的指针根本不同float32。相比之下,您可以简单地将 a 类型转换*int32为 a *int64。

慕雪6442864

一种方法是编写一个函数来安全地将 float32 指针转换为 float64 指针。package mainimport "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}
打开App,查看更多内容
随时随地看视频慕课网APP