mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-18 11:44:20 +08:00
make zh2tw
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
### 3.6.2. 無類型常量
|
||||
|
||||
|
||||
Go语言的常量有点不寻常. 虽然一个常量可以有任意有一个确定的基础类型, 例如 int 或 float64, 或者是类似 time.Duration 这样命名的基础类型, 但是许多常量并没有一个明确的基础类型. 编译期为这些没有明确的基础类型的数字常量提供比基础类型或机器更高精度的算术运算; 你可以认为至少有256bit的运算精度. 这里有六种未明确类型的常量类型, 分别是 无类型的布尔型, 无类型的整数, 无类型的字符, 无类型的浮点数, 无类型的复数, 无类型的字符串.
|
||||
Go語言的常量有點不尋常. 雖然一個常量可以有任意有一個確定的基礎類型, 例如 int 或 float64, 或者是類似 time.Duration 這樣命名的基礎類型, 但是許多常量併沒有一個明確的基礎類型. 編譯期爲這些沒有明確的基礎類型的數字常量提供比基礎類型或機器更高精度的算術運算; 你可以認爲至少有256bit的運算精度. 這里有六種未明確類型的常量類型, 分别是 無類型的布爾型, 無類型的整數, 無類型的字符, 無類型的浮點數, 無類型的複數, 無類型的字符串.
|
||||
|
||||
通过延迟明确具体类型, 无类型的常量不仅可以提供更高的精度, 而且可以直接用于更多的表达式而不需要类型转换. 例如 例子中的 ZiB 和 YiB 的值已经超出任何Go中整数类型能表达的范围, 但是它们依然是合法的常量, 而且可以像下面表达式这样使用:
|
||||
通過延遲明確具體類型, 無類型的常量不僅可以提供更高的精度, 而且可以直接用於更多的表達式而不需要類型轉換. 例如 例子中的 ZiB 和 YiB 的值已經超齣任何Go中整數類型能表達的范圍, 但是它們依然是合法的常量, 而且可以像下面表達式這樣使用:
|
||||
|
||||
```Go
|
||||
fmt.Println(YiB/ZiB) // "1024"
|
||||
```
|
||||
|
||||
另一个例子, math.Pi 无类型的浮点数常量, 可以直接用于任意需要浮点数或复数的地方:
|
||||
另一個例子, math.Pi 無類型的浮點數常量, 可以直接用於任意需要浮點數或複數的地方:
|
||||
|
||||
```Go
|
||||
var x float32 = math.Pi
|
||||
@@ -17,7 +17,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
|
||||
@@ -27,9 +27,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
|
||||
@@ -38,7 +38,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
|
||||
@@ -47,7 +47,7 @@ f = 1e123 // untyped floating-point -> float64
|
||||
f = 'a' // untyped rune -> float64
|
||||
```
|
||||
|
||||
上面的语句相当于:
|
||||
上面的語句相當於:
|
||||
|
||||
```Go
|
||||
var f float64 = float64(3 + 0i)
|
||||
@@ -56,7 +56,7 @@ f = float64(1e123)
|
||||
f = float64('a')
|
||||
```
|
||||
|
||||
无论是隐式或显式, 将一种类型转换为另一种类型要求目标可以表示原始值. 对于浮点数和复数, 可能会有舍入处理:
|
||||
無論是隱式或顯式, 將一種類型轉換爲另一種類型要求目標可以表示原始值. 對於浮點數和複數, 可能會有舍入處理:
|
||||
|
||||
```Go
|
||||
const (
|
||||
@@ -70,7 +70,7 @@ const (
|
||||
)
|
||||
```
|
||||
|
||||
对于一个没有显式类型的变量声明(包括短变量声明语法), 无类型的常量会被隐式转为默认的变量类型, 就像下面的例子:
|
||||
對於一個沒有顯式類型的變量聲明(包括短變量聲明語法), 無類型的常量會被隱式轉爲默認的變量類型, 就像下面的例子:
|
||||
|
||||
```Go
|
||||
i := 0 // untyped integer; implicit int(0)
|
||||
@@ -79,16 +79,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"
|
||||
@@ -97,7 +97,7 @@ fmt.Printf("%T\n", 0i) // "complex128"
|
||||
fmt.Printf("%T\n", '\000') // "int32" (rune)
|
||||
```
|
||||
|
||||
现在我们已经讲述了Go语言中全部的基础数据类型. 下一步将演示如何用基础数据类型组合成数组或结构体等复杂数据类型, 然后构建用于解决实际编程问题的数据结构, 这将是第四章的讨论主题.
|
||||
現在我們已經講述了Go語言中全部的基礎數據類型. 下一步將演示如何用基礎數據類型組合成數組或結構體等複雜數據類型, 然後構建用於解決實際編程問題的數據結構, 這將是第四章的討論主題.
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user