您的代码失败的原因很简单,就是您试图取消引用尚未初始化的指针: 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。