如何將 float32 指標轉換*float32為 float64 指標*float64。
package main
import "fmt"
func main() {
var value *float32
v := float64(*value)
vp := &v
fmt.Println(vp)
}
以下代碼回傳
運行時錯誤:無效的記憶體地址或 nil 指標取消參考
uj5u.com熱心網友回復:
您的代碼失敗的原因僅僅是您試圖取消參考尚未初始化的指標:
var value *float32
宣告一個指向 a 的指標float32,但不初始化它,從而產生一個nil指標。
v := float64(*value)
然后嘗試取消參考value,但正如我們剛剛確定value的那樣nil- 它沒有指向任何東西,因此詢問它指向的內容必然會導致錯誤。
但是,您的代碼實際上很好,只要您有a*float32實際指向 afloat32,我們可以看到我們是否添加了一個實際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
這不是錯誤,這是 a float64vs內部表示不同的結果float32。
無法保證這些不同型別中的值完全相同——每種型別都具有使某些值無法從字面上表示的特征,因此不可能保證float32(v) == float64(v)每個v.
這也是為什么您不能簡單地對指標進行型別轉換的原因:
vp := *float64(value)
這是非法的,因為指向 a 的指標float64指向的東西與指向 a 的指標根本不同float32。
相比之下,您可以簡單地將 a 型別轉換*int32為*int64.
uj5u.com熱心網友回復:
一種方法是撰寫一個函式來安全地將 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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532306.html
標籤:去指针
上一篇:在C中洗掉雙向鏈表中的唯一元素
