mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-17 19:24:19 +08:00
回到简体
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
### 3.6.2. 無類型常量
|
||||
### 3.6.2. 无类型常量
|
||||
|
||||
Go語言的常量有個不同尋常之處。雖然一個常量可以有任意有一個確定的基礎類型,例如int或float64,或者是類似time.Duration這樣命名的基礎類型,但是許多常量併沒有一個明確的基礎類型。編譯器爲這些沒有明確的基礎類型的數字常量提供比基礎類型更高精度的算術運算;你可以認爲至少有256bit的運算精度。這里有六種未明確類型的常量類型,分别是無類型的布爾型、無類型的整數、無類型的字符、無類型的浮點數、無類型的複數、無類型的字符串。
|
||||
Go语言的常量有个不同寻常之处。虽然一个常量可以有任意有一个确定的基础类型,例如int或float64,或者是类似time.Duration这样命名的基础类型,但是许多常量并没有一个明确的基础类型。编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算;你可以认为至少有256bit的运算精度。这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。
|
||||
|
||||
通過延遲明確常量的具體類型,無類型的常量不僅可以提供更高的運算精度,而且可以直接用於更多的表達式而不需要顯式的類型轉換。例如,例子中的ZiB和YiB的值已經超出任何Go語言中整數類型能表達的范圍,但是它們依然是合法的常量,而且可以像下面常量表達式依然有效(譯註:YiB/ZiB是在編譯期計算出來的,併且結果常量是1024,是Go語言int變量能有效表示的):
|
||||
通过延迟明确常量的具体类型,无类型的常量不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。例如,例子中的ZiB和YiB的值已经超出任何Go语言中整数类型能表达的范围,但是它们依然是合法的常量,而且可以像下面常量表达式依然有效(译注:YiB/ZiB是在编译期计算出来的,并且结果常量是1024,是Go语言int变量能有效表示的):
|
||||
|
||||
```Go
|
||||
fmt.Println(YiB/ZiB) // "1024"
|
||||
```
|
||||
|
||||
另一個例子,math.Pi無類型的浮點數常量,可以直接用於任意需要浮點數或複數的地方:
|
||||
另一个例子,math.Pi无类型的浮点数常量,可以直接用于任意需要浮点数或复数的地方:
|
||||
|
||||
```Go
|
||||
var x float32 = math.Pi
|
||||
@@ -16,7 +16,7 @@ var y float64 = math.Pi
|
||||
var z complex128 = math.Pi
|
||||
```
|
||||
|
||||
如果math.Pi被確定爲特定類型,比如float64,那麽結果精度可能會不一樣,同時對於需要float32或complex128類型值的地方則會強製需要一個明確的類型轉換:
|
||||
如果math.Pi被确定为特定类型,比如float64,那么结果精度可能会不一样,同时对于需要float32或complex128类型值的地方则会强制需要一个明确的类型转换:
|
||||
|
||||
```Go
|
||||
const Pi64 float64 = math.Pi
|
||||
@@ -26,9 +26,9 @@ var y float64 = Pi64
|
||||
var z complex128 = complex128(Pi64)
|
||||
```
|
||||
|
||||
對於常量面值,不同的寫法可能會對應不同的類型。例如0、0.0、0i和'\u0000'雖然有着相同的常量值,但是它們分别對應無類型的整數、無類型的浮點數、無類型的複數和無類型的字符等不同的常量類型。同樣,true和false也是無類型的布爾類型,字符串面值常量是無類型的字符串類型。
|
||||
对于常量面值,不同的写法可能会对应不同的类型。例如0、0.0、0i和'\u0000'虽然有着相同的常量值,但是它们分别对应无类型的整数、无类型的浮点数、无类型的复数和无类型的字符等不同的常量类型。同样,true和false也是无类型的布尔类型,字符串面值常量是无类型的字符串类型。
|
||||
|
||||
前面説過除法運算符/會根據操作數的類型生成對應類型的結果。因此,不同寫法的常量除法表達式可能對應不同的結果:
|
||||
前面说过除法运算符/会根据操作数的类型生成对应类型的结果。因此,不同写法的常量除法表达式可能对应不同的结果:
|
||||
|
||||
```Go
|
||||
var f float64 = 212
|
||||
@@ -37,7 +37,7 @@ fmt.Println(5 / 9 * (f - 32)) // "0"; 5/9 is an untyped integer, 0
|
||||
fmt.Println(5.0 / 9.0 * (f - 32)) // "100"; 5.0/9.0 is an untyped float
|
||||
```
|
||||
|
||||
隻有常量可以是無類型的。當一個無類型的常量被賦值給一個變量的時候,就像上面的第一行語句,或者是像其餘三個語句中右邊表達式中含有明確類型的值,無類型的常量將會被隱式轉換爲對應的類型,如果轉換合法的話。
|
||||
只有常量可以是无类型的。当一个无类型的常量被赋值给一个变量的时候,就像上面的第一行语句,或者是像其余三个语句中右边表达式中含有明确类型的值,无类型的常量将会被隐式转换为对应的类型,如果转换合法的话。
|
||||
|
||||
```Go
|
||||
var f float64 = 3 + 0i // untyped complex -> float64
|
||||
@@ -46,7 +46,7 @@ f = 1e123 // untyped floating-point -> float64
|
||||
f = 'a' // untyped rune -> float64
|
||||
```
|
||||
|
||||
上面的語句相當於:
|
||||
上面的语句相当于:
|
||||
|
||||
```Go
|
||||
var f float64 = float64(3 + 0i)
|
||||
@@ -55,7 +55,7 @@ f = float64(1e123)
|
||||
f = float64('a')
|
||||
```
|
||||
|
||||
無論是隱式或顯式轉換,將一種類型轉換爲另一種類型都要求目標可以表示原始值。對於浮點數和複數,可能會有舍入處理:
|
||||
无论是隐式或显式转换,将一种类型转换为另一种类型都要求目标可以表示原始值。对于浮点数和复数,可能会有舍入处理:
|
||||
|
||||
```Go
|
||||
const (
|
||||
@@ -69,7 +69,7 @@ const (
|
||||
)
|
||||
```
|
||||
|
||||
對於一個沒有顯式類型的變量聲明語法(包括短變量聲明語法),無類型的常量會被隱式轉爲默認的變量類型,就像下面的例子:
|
||||
对于一个没有显式类型的变量声明语法(包括短变量声明语法),无类型的常量会被隐式转为默认的变量类型,就像下面的例子:
|
||||
|
||||
```Go
|
||||
i := 0 // untyped integer; implicit int(0)
|
||||
@@ -78,16 +78,16 @@ f := 0.0 // untyped floating-point; implicit float64(0.0)
|
||||
c := 0i // untyped complex; implicit complex128(0i)
|
||||
```
|
||||
|
||||
註意默認類型是規則的:無類型的整數常量默認轉換爲int,對應不確定的內存大小,但是浮點數和複數常量則默認轉換爲float64和complex128。Go語言本身併沒有不確定內存大小的浮點數和複數類型,而且如果不知道浮點數類型的話將很難寫出正確的數值算法。
|
||||
注意默认类型是规则的:无类型的整数常量默认转换为int,对应不确定的内存大小,但是浮点数和复数常量则默认转换为float64和complex128。Go语言本身并没有不确定内存大小的浮点数和复数类型,而且如果不知道浮点数类型的话将很难写出正确的数值算法。
|
||||
|
||||
如果要給變量一個不同的類型,我們必須顯式地將無類型的常量轉化爲所需的類型,或給聲明的變量指定明確的類型,像下面例子這樣:
|
||||
如果要给变量一个不同的类型,我们必须显式地将无类型的常量转化为所需的类型,或给声明的变量指定明确的类型,像下面例子这样:
|
||||
|
||||
```Go
|
||||
var i = int8(0)
|
||||
var i int8 = 0
|
||||
```
|
||||
|
||||
當嚐試將這些無類型的常量轉爲一個接口值時(見第7章),這些默認類型將顯得尤爲重要,因爲要靠它們明確接口對應的動態類型。
|
||||
当尝试将这些无类型的常量转为一个接口值时(见第7章),这些默认类型将显得尤为重要,因为要靠它们明确接口对应的动态类型。
|
||||
|
||||
```Go
|
||||
fmt.Printf("%T\n", 0) // "int"
|
||||
@@ -96,7 +96,7 @@ fmt.Printf("%T\n", 0i) // "complex128"
|
||||
fmt.Printf("%T\n", '\000') // "int32" (rune)
|
||||
```
|
||||
|
||||
現在我們已經講述了Go語言中全部的基礎數據類型。下一步將演示如何用基礎數據類型組合成數組或結構體等複雜數據類型,然後構建用於解決實際編程問題的數據結構,這將是第四章的討論主題。
|
||||
现在我们已经讲述了Go语言中全部的基础数据类型。下一步将演示如何用基础数据类型组合成数组或结构体等复杂数据类型,然后构建用于解决实际编程问题的数据结构,这将是第四章的讨论主题。
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user