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。
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
}
- 2 回答
- 0 关注
- 119 浏览
添加回答
举报