Table of Contents
地址:https://www.w3cschool.cn/go/go-constants.html
Go 语言常量
常量是一个简单的标识符,在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
const identifier [type] = value
多个相同类型的声明可以简写:
const c_name1, c_name2 = value1, value2
常量还可以用作枚举:
const {
  Unknown = 0
  Female = 1
  Male = 2
}
常量可以用 len(), cap(), unsafe.Sizeof() 常量计算表达式的值。(常量表达式(const experssion):是指(1)值不会改变 并且 (2)在编译过程就能得到计算结果的表达式。)常量表达式中,函数必须是内置函数,否则编译不过:
package main
import "unsafe"
const (
  a = "abc"
  b = len(a)
  c = unsafe.Sizeof(a)
)
var d = len(a)
func main(){
  println(a, b, c)
  println(d)
}
常量使用小括号声明赋值时,后面的常量如果没有指定值,其会被赋予前面一个常量的值(这条教程里没有,时根据结果推断的。):
package main
const (
  a = 1
  b
  c
)
func main() {
  println(a, b, c) // 1, 1, 1
}
iota
iota 是特殊常量,可以认为是一个可以被编译器修改的常量。
在每一个 const 关键字出现时,iota 被重置为 0,然后在下一个 const 出现之前,没出现一次 iota,其所代表的数字会自动增加 1。
iota 可以被用作枚举值:
const ( a = iota b = iota c = iota ) // a, b, c——0, 1, 2
iota 用法
package main
import "fmt"
func main() {
  const (
    a = iota  // 0
    b         // 1
    c         // 2
    d = "ha"  // 独立值,iota += 1
    e         // "ha",iota += 1
    f = 100   // iota += 1
    g         // 100 iota += 1
    h = iota  // 7,恢复计数
    i         // 8
  )
  fmt.Println(a, b, c, d, e, f, g, h, i) // 0 1 2 ha ha 100 100 7 8
}
Go 语言运算符
运算符用于在程序运行时执行数学或逻辑运算。
Go 语言内置的运算符有:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其他运算符
算术运算符
+、-、*、/、%、++、–
关系运算符
==、!=、>、<、>=、<=
逻辑运算符
&&、||、!
位运算符
&、|、^、<<、>>
赋值运算符
=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
其他运算符
&(返回变量存储地址)、*(指针变量)
运算符优先级
下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
| 优先级 | 分类 | 运算符 | 结合性 | 
|---|---|---|---|
| 1 | 逗号运算符 | , | 从左到右 | 
| 2 | 赋值运算符 | =、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、|= | 从右到左 | 
| 3 | 逻辑或 | || | 从左到右 | 
| 4 | 逻辑与 | && | 从左到右 | 
| 5 | 按位或 | | | 从左到右 | 
| 6 | 按位异或 | ^ | 从左到右 | 
| 7 | 按位与 | & | 从左到右 | 
| 8 | 相等/不等 | ==、!= | 从左到右 | 
| 9 | 关系运算符 | <、<=、>、>= | 从左到右 | 
| 10 | 位移运算符 | <<、>> | 从左到右 | 
| 11 | 加法/减法 | +、- | 从左到右 | 
| 12 | 乘法/除法/取余 | *(乘号)、/、% | 从左到右 | 
| 13 | 单目运算符 | !、*(指针)、& 、++、–、+(正号)、-(负号) | 从右到左 | 
| 14 | 后缀运算符 | ( )、[ ]、-> | 从左到右 | 
Go 语言条件语句
Go 语言提供了以下几种条件判断语句:
| 语句 | 描述 | 
|---|---|
| if 语句 | if 语句 由一个布尔表达式后紧跟一个或多个语句组成。 | 
| if…else 语句 | if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 | 
| if 嵌套语句 | 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。 | 
| switch 语句 | switch 语句用于基于不同条件执行不同动作。 | 
| select 语句 | select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 | 
if 语句
Go 语言中,if 后面的判断语句不需要括号,并可以有多个语句。但语句体必须在花括号里,哪怕只有一条语句。
package main
func main() {
  var a = 1
  
  if a < 1 {
    println("a < 1, true")
  } else if b := 3; a > b {
    println("a > b, true")
  } else {
    println("a > b, false")
  }
}
if 后面的判断语句可以有多句,但其中定义的变量只能在 if 语句块中使用。
switch 语句
Go 语言中,switch 语句不需要 break。switch 后面也可以没有判断语句,判断在 case 后面。多个匹配项可以写在一个 case 后面,用逗号分隔。
package main
func main() {
  var a = 2
  switch a {
    case 1:
      println("a match 1")
    case 2, 3:
      println("a match 2 or 3")
  }
  switch {
    case a == 1:
      println("a match 1")
    case a == 2:
      println("a match 2")
  }
}
Type Switch
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switch x.(type){
  case type:
    statement(s);      
  case type:
    statement(s); 
  /* 你可以定义任意个数的case */
  default: /* 可选 */
    statement(s);
}
Select 语句
select 类似于 switc。Go 语言中 select 语句的语法:
以下描述了 select 语句的语法:
- 每个case都必须是一个通信
- 所有channel表达式都会被求值
- 所有被发送的表达式都会被求值
- 如果任意某个通信可以进行,它就执行;其他被忽略。
- 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。
 否则:- 如果有default子句,则执行该语句。
- 如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。
 
Go 语言循环语句
Go 语言循环语句只有 for,没有 while、do……while 这些。
循环控制语句
break、continue、goto
for 循环
Go 语言的 for 循环有 3 种形式,只有其中的一种使用分号。
和 C 语言的 for 一样:
for init; condition; post {}
和 C 的 while 一样:
for condition {}
和 C 的 for(;;) 一样(无限循环):
for {}
- init:一般为赋值表达式,给控制变量赋初值;
- condition:关系表达式或逻辑表达式,循环控制条件;
- post:一般为赋值表达式,给控制变量增量或减量。
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。
for key, value := range oldMap {
  newMap[key] = value
}