|
@@ -236,7 +236,7 @@ _69 // 下划线不能出现在首尾
|
|
|
- 一个浮点数字面量的默认类型是预声明的float64类型。
|
|
|
- 如果一个字面量含有虚部字面量,则此字面量的默认类型是预声明的 complex128类型。
|
|
|
|
|
|
-## 类型不确定厂里的显示类型转换
|
|
|
+### 类型不确定厂里的显示类型转换
|
|
|
|
|
|
### 一些合法的转换
|
|
|
|
|
@@ -277,5 +277,160 @@ string(65.0)
|
|
|
string(66+0i)
|
|
|
```
|
|
|
|
|
|
+## 常量声明(具名)
|
|
|
|
|
|
+```go
|
|
|
+1| package main
|
|
|
+2|
|
|
|
+3| // 声明了两个单独的具名常量。(是的,
|
|
|
+4| // 非ASCII字符可以用做标识符。)
|
|
|
+5| const π = 3.1416
|
|
|
+6| const Pi = π // 等价于:const Pi = 3.1416
|
|
|
+7|
|
|
|
+8| // 声明了一组具名常量。
|
|
|
+9| const (
|
|
|
+10| No = !Yes
|
|
|
+11| Yes = true
|
|
|
+12| MaxDegrees = 360
|
|
|
+13| Unit = "弧度"
|
|
|
+14| )
|
|
|
+15|
|
|
|
+16| func main() {
|
|
|
+17| // 声明了三个局部具名常量。
|
|
|
+18| const DoublePi, HalfPi, Unit2 = π * 2, π * 0.5, "度"
|
|
|
+19| }
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+常量声明中的等号=表示“绑定”而非“赋值”。每个常量描述将一个或多个字面 量绑定到各自对应的具名常量上。 或者说,每个具名常量其实代表着一个字面常 量。
|
|
|
+
|
|
|
+常量可以直接声明在包中,也可以声明在函数体中。 声明在函数体中的常量 称为局部常量(local constant),直接声明在包中的常量称为包级常量 (package-level constant)。
|
|
|
+
|
|
|
+包级常量也常常被称为全局常量。
|
|
|
+
|
|
|
+包级常量声明中的常量描述的顺序并不重要。比如在上面的例子中,常量描述No和Yes的顺序可以掉换一下。
|
|
|
+
|
|
|
+### 类型确定具名常量
|
|
|
+
|
|
|
+我们可以在声明一些常量的时候指定这些常量的确切类型。这样声明的常量称为类型确定具名常量。
|
|
|
+
|
|
|
+```go
|
|
|
+1| const X float32 = 3.14
|
|
|
+2|
|
|
|
+3| const (
|
|
|
+4| A, B int64 = -3, 5
|
|
|
+5| Y float32 = 2.718
|
|
|
+6| )
|
|
|
+//我们也可以使用显式类型转换来声明类型确定常量。 下面的例子和上面的例子是完全等价的
|
|
|
+1| const X = float32(3.14)
|
|
|
+2|
|
|
|
+3| const (
|
|
|
+4| A, B = int64(-3), int64(5)
|
|
|
+5| Y = float32(2.718)
|
|
|
+6| )
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 常量声明中的自动补全
|
|
|
+
|
|
|
+在一个包含多个常量描述的常量声明中,除了第一个常量描述,其它后续的常量描 述都可以只有标识符部分。 Go编译器将通过照抄前面最紧挨的一个完整的常量描述 来自动补全不完整的常量描述。
|
|
|
+
|
|
|
+```go
|
|
|
+1| const (
|
|
|
+2| X float32 = 3.14
|
|
|
+3| Y // 这里必须只有一个标识符
|
|
|
+4| Z // 这里必须只有一个标识符
|
|
|
+5|
|
|
|
+6| A, B = "Go", "language"
|
|
|
+7| C, _
|
|
|
+8| // 上一行中的空标识符是必需的(如果
|
|
|
+9| // 上一行是一个不完整的常量描述)。
|
|
|
+10| )
|
|
|
+
|
|
|
+//自动补全
|
|
|
+
|
|
|
+1| const (
|
|
|
+2| X float32 = 3.14
|
|
|
+3| Y float32 = 3.14
|
|
|
+4| Z float32 = 3.14
|
|
|
+5|
|
|
|
+6| A, B = "Go", "language"
|
|
|
+7| C, _ = "Go", "language"
|
|
|
+8| )
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 在常量声明中使用iota
|
|
|
+
|
|
|
+iota是Go预声明(内置)的一个特殊的具名常量。其被预声明为0,但是它的值在编译阶段并非恒定。当此预声明的iota出现在一个常量声明中的时候,它 的值在第n个常量描述中的值为n(从0开始)。 所以iota只对含有多个常量描述 的常量声明有意义。
|
|
|
+
|
|
|
+例如
|
|
|
+
|
|
|
+```go
|
|
|
+package main
|
|
|
+2|
|
|
|
+3| func main() {
|
|
|
+4| const (
|
|
|
+5| k = 3 // 在此处,iota == 0
|
|
|
+6|
|
|
|
+7| m float32 = iota + .5 // m float32 = 1 + .5
|
|
|
+8| n // n float32 = 2 + .5
|
|
|
+9|
|
|
|
+10| p = 9 // 在此处,iota == 3
|
|
|
+11| q = iota * 2 // q = 4 * 2
|
|
|
+12| _ // _ = 5 * 2
|
|
|
+13| r // r = 6 * 2
|
|
|
+14| s, t = iota, iota // s, t = 7, 7
|
|
|
+15| u, v // u, v = 8, 8
|
|
|
+16| _, w // _, w = 9, 9
|
|
|
+17| )
|
|
|
+18|
|
|
|
+19| const x = iota // x = 0 (iota == 0)
|
|
|
+20| const (
|
|
|
+21| y = iota // y = 0 (iota == 0)
|
|
|
+22| z // z = 1
|
|
|
+23| )
|
|
|
+24|
|
|
|
+25| println(m) // +1.500000e+000
|
|
|
+26| println(n) // +2.500000e+000
|
|
|
+27| println(q, r) // 8 12
|
|
|
+28| println(s, t, u, v, w) // 7 7 8 8 9
|
|
|
+29| println(x, y, z) // 0 0 1
|
|
|
+30| }
|
|
|
+```
|
|
|
+
|
|
|
+实际编程中,我们应该用更有意义的方式。比如:
|
|
|
+
|
|
|
+```go
|
|
|
+1| const (
|
|
|
+2| Failed = iota - 1 // == -1
|
|
|
+3| Unknown // == 0
|
|
|
+4| Succeeded // == 1
|
|
|
+5| )
|
|
|
+6|
|
|
|
+7| const (
|
|
|
+8| Readable = 1 << iota // == 1
|
|
|
+9| Writable // == 2
|
|
|
+10| Executable // == 4
|
|
|
+11| )
|
|
|
+```
|
|
|
+
|
|
|
+## 变量声明和赋值操作语句
|
|
|
+
|
|
|
+所有的变量值都是类型确定值。当声明一个变量的时候,我们必须在代码中给编译 器提供足够的信息来让编译器推断出此变量的确切类型。
|
|
|
+
|
|
|
+Go语言有两种变量声明形式。一种称为标准形式,另一种称为短声明形式。 短声明形式只能用来声明局部变量。
|
|
|
+
|
|
|
+和常量声明一样,多个变量可以用一对小括号组团在一起被声明。
|
|
|
+
|
|
|
+```go
|
|
|
+1| var (
|
|
|
+2| lang, bornYear, compiled = "Go", 2007, true
|
|
|
+3| announceAt, releaseAt int = 2009, 2012
|
|
|
+4| createdBy, website string
|
|
|
+5| )
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 每个局部声明的变量至少要被有效使用一次
|
|
|
|