Go 学习笔记(二)(常量、运算符、条件语句、循环语句)

地址: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会随机公平地选出一个执行。其他不会执行。
    否则:
    1. 如果有default子句,则执行该语句。
    2. 如果没有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
}