3 回答

TA貢獻1859條經驗 獲得超6個贊
這一行:
p.X = 1e9
是一個任務。Spec 對分配有以下要求:
在賦值中,每個值都必須可以分配給它所分配的操作數的類型......
以下可分配性規則涵蓋了上述分配:
1e9
是一個無類型的浮點常量,并且該值可以由一個類型的值int
精確表示,所以一切都很好。
如果它是一個類型化的常量,那將是一個編譯時錯誤,例如
p.X = float64(1e9) // error: cannot use float64(1e+09) (type float64) as type int in assignment
因為上述可分配性規則將不適用,所有其他規則也不適用。
如果無類型浮點常量值不能用 type 的值表示,情況也是int
如此,例如在這些情況下:
p.X = 1e99 // error: constant overflows int p.X = 1.1 // error: constant 1.1 truncated to integer

TA貢獻1865條經驗 獲得超7個贊
常量值由符文、整數、浮點數、虛數或字符串字面量表示,...
數字常量表示任意精度的精確值并且不會溢出。
常量可以有類型或無類型。文字常量 ... 是無類型的。
在變量聲明中使用時,可以隱式地為常量賦予類型……。如果常量值不能表示為相應類型的值,則這是錯誤的。
type Vertex struct {
X int
Y int
}
v := Vertex{1, 2}
p := &v
p.X = 1e9 // <- this line does not produce a type error
1e9是一個無類型的數字常量,表示為浮點文字。
當無類型的數字常量1e9被分配給一個int變量 ( p.X, type Vertex {X int}) 時,它會int隱式地給定類型。1e9( 1,000,000,000) 可以表示為 type 的值int。

TA貢獻1836條經驗 獲得超3個贊
Go 編程語言規范/轉換:
轉換可能按字面意思出現在源代碼中,也可能由表達式出現的上下文暗示。
Go 編程語言規范/數字類型之間的轉換
將浮點數轉換為整數時,會丟棄小數(截斷至零)。
這里:
p.x = 1e9 // it's floating literal with implied conversion by context
https://golang.org/ref/spec#Conversions
- 3 回答
- 0 關注
- 163 瀏覽
添加回答
舉報