回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -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言中全部的基础数据类型。下一步演示如何用基础数据类型组合成数组或结构体等复杂数据类型,然后构建用于解决实际编程问题的数据结构,这将是第四章的讨论主题