目录
1. 变量
1.1 基本类型、引用类型、结构类型
Go语言的基本类型有:
- bool
- string
- int、int8、int16、int32、int64
- uint、uint8、uint16、uint32、uint64、uintptr
- byte // uint8 的别名
- rune // int32 的别名 代表一个 Unicode 码
- float32、float64
- complex64、complex128
Go语言的引用类型:
切片、映射、通道、接口和函数类型
结构类型
1.2 变量的声明
标准格式
Go 语言的变量声明的标准格式为:
var 变量名 变量类型
变量声明以关键字 var 开头,后置变量类型,行尾无须分号。
批量格式
觉得每行都用 var 声明变量比较烦琐?没关系,还有一种为懒人提供的定义变量的方法:
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
简短格式
名字 := 表达式
a, s := 1, "abc"
例子
package main
import "fmt"
func main() {
var 可以声明 1 个或者多个变量。
var a string = "initial"
你可以申明一次性声明多个变量。
var b, c int = 1, 2
Go 将自动推断已经初始化的变量类型。
var d = true
声明变量且没有给出对应的初始值时,变量将会初始化为零值 。例如,一个 int 的零值是 0。
var e int
:= 语句是申明并初始化变量的简写,例如这个例子中的 var f string = "short"。
f := "short"
}
1.3 变量的初始化
变量初始化的标准格式
var 变量名 类型 = 表达式
var hp int = 100
编译器推导类型的格式
在标准格式的基础上,将 int 省略后,编译器会尝试根据等号右边的表达式推导 hp 变量的类型。
var hp = 100
短变量声明并初始化
var 的变量声明还有一种更为精简的写法,例如:
hp := 100
多重赋值(初始化、交换、返回值)
var a int = 100
var b int = 200
b, a = a, b
fmt.Println(a, b)
多重赋值时,变量的左值和右值按从左到右的顺序赋值。
多重赋值在 Go 语言的错误处理和函数返回值中会大量地使用。
2. 常量
package main
import "fmt"
import "math"
const 用于声明一个常量。
const s string = "constant"
func main() {
const 语句可以出现在任何 var 语句可以出现的地方
const n = 500000000
常数表达式可以执行任意精度的运算
const d = 3e20 / n
数值型常量是没有确定的类型的,直到它们被给定了一个类型,比如说一次显示的类型转化。
fmt.Println(int64(d))
当上下文需要时,一个数可以被给定一个类型,比如变量赋值或者函数调用。举个例子,这里的 math.Sin函数需要一个 float64 的参数。
fmt.Println(math.Sin(n))
}
3. 循环
3.1 普通循环
package main
import "fmt"
func main() {
最常用的方式,带单个循环条件。
i := 1
for i <= 3 {
fmt.Println(i)
i = i + 1
}
经典的初始化/条件/后续形式 for 循环。
for j := 7; j <= 9; j++ {
fmt.Println(j)
}
不带条件的 for 循环将一直执行,直到在循环体内使用了 break 或者 return 来跳出循环。
for {
fmt.Println("loop")
break
}
}
3.2 range循环
需要强调的是,range 创建了每个元素的副本,而不是直接返回对该元素的引用。因此直接改变value是没用用的。
arr := [3]int{1, 4, 5}
for index, value := range arr {
fmt.Println(index, value)
}
对数组使用range会自动迭代,并在每次迭代返回两个值,第一个是索引,第二个是值,但是在go语言中,只要定义的变量就必须使用,而且我们常常用不到索引,那么怎么办呢?
用单下划线来替代索引,这样就省略了变量的定义。
for _, v := range arr {
fmt.Println(v)
}
4. 条件
package main
import "fmt"
func main() {
这里是一个基本的例子。
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
你可以不要 else 只用 if 语句。
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
在条件语句之前可以有一个语句;任何在这里声明的变量都可以在所有的条件分支中使用。
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
}
5. switch
1 package main
2 import "fmt"
3 import "time"
4 func main() {
5 一个基本的 switch。
7 i := 2
8 fmt.Print("write ", i, " as ")
9 switch i {
10 case 1:
11 fmt.Println("one")
12 case 2:
13 fmt.Println("two")
14 case 3:
15 fmt.Println("three")
16 }
17 在一个 case 语句中,你可以使用逗号来分隔多个表达式。在这个例子中,我们很好的使用了可选的default 分支。
19 switch time.Now().Weekday() {
20 case time.Saturday, time.Sunday:
21 fmt.Println("it's the weekend")
22 default:
23 fmt.Println("it's a weekday")
24 }
25 不带表达式的 switch 是实现 if/else 逻辑的另一种方式。这里展示了 case 表达式是如何使用非常量的。
27 t := time.Now()
28 switch {
29 case t.Hour() < 12:
30 fmt.Println("it's before noon")
31 default:
32 fmt.Println("it's after noon")
33 }
34 }