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 }