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占用兩倍字節(jié)數(shù)的 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個贊
一種方法是編寫一個函數(shù)來安全地將 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 關注
- 170 瀏覽
添加回答
舉報