1.变量/常量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# var name = expression 根据expression判断type
var a = "initial"
fmt.Println(a)

# var name type = expression
var b, c int = 1, 2
fmt.Println(b, c)

# go中的零值 数字 > 0 布尔 > false, 字符串 > "" 接口和引用类型(slice, 指针, map, 通道, 函数) > nil
# var name type
var e int
fmt.Println(e)

# 短变量 name := expression
# 短小灵活在局部变量声明和初始化主要使用
f := "apple"
fmt.Println(f)

# 常量
# const name type = expression
const s string = "constant"
# iota常量生成器 从0开始
type Currency int
const (
    USD Currency iota
    EUR
    RMB

2.if else

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
if 7 % 2 == 0 {
    fmt.Println("7 is even")
} else {
    fmt.Println("7 is odd")
}

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")
}

3.switch

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
i := 2
fmt.Print("Write ", i, " as ")
switch i {
case 1:
    fmt.Println("one")
case 2:
    fmt.Println("two")
case 3:
    fmt.Println("three")
}

switch time.Now().Weekday() {
case time.Saturday, time.Sunday:
    fmt.Println("It's the weekend")
default:
    fmt.Println("It's a weekday")
}

4.for

go中唯一的循环语句

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
i := 1
for i <= 3 {
    fmt.Println(i)
    i = i + 1
}

for j := 7; j <= 9; j++ {
    fmt.Println(j)
}

for {
    fmt.Println("loop")
    break
}

for n := 0; n <= 5; n++ {
    if n % 2 == 0 {
        continue
	 }
	 fmt.Println(n)
}

5.数组

数组长度固定,本身不可变,无法添加或者删除元素, 所以使用场景较少

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 默认 初始值是零值
var a [3]int

# 下标和值
for i, v in range a {
    fmt.Println("%d %d\n", i, v)
}

# 不关心下标
for _, v in range a {
    fmt.Println("%d\n", v)
}

# 元素初始化
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}

# 数组的长度由初始化数组的元素个数决定
q := [...]int{1, 2, 3}

# 100个元素的数组出了最后是-1以外其余都是0
r := [...]int{99: -1}

6.slice

[]T 拥有相同类型可变长度的序列 var x []int x[m:n] 返回原始字节的一个子序列 三个属性 指针 长度(len) 容量(cap) slice包含了指向数组元素的指针,所以将一个slice传递给函数时,可以在函数内部修改底层数组的元素

1
2
3
4
# 数组 
var list = [3]int{1, 2, 3}
# slice
seq = list[1:2]

检查slice是否为空 len(s) == 0 不能用==比较slice slice的元素非直接,有可能包含自身 不能用作map的key 如果底层数组元素改变,同一个slice在不同时间有不同的元素

使用内建函数make创建一个具有指定元素类型,长度和容量的slice make([]T, len) make([]T, len, cap)

7.map

map[k]v 具有键值对元素的无序集合 map中所有key拥有相同的数据类型 所有的value拥有相同的数据类型 key的类型 必须可以通过==来进行比较

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ages := make(map[string]int)
ages := make(map[string]int){
    "alice": 24,
    "charlie": 34
}


# 先声明 后赋值 
ages := make(map[string]int)
ages["alice"] = 31
ages["charlie"] = 34

# 删除
delete(ages, "alice")

for name, age in range ages {
    fmt.Println("%s\t%d\n", name, age)
} 
 
 var ages map[string]int
 fmt.Println(ages==nil) # "true"
 fmt.Println(len(ages) == 0) # "true"
 ages["carol"] = 21 # 报错, map必须初始化, 才可以赋值
 
 # 如果key不在map中则得到map值类型的零值
 # bob不是字典的键age==0,  ok判断key是否存在
 age, ok = ags["bob"], !ok { /* ... */}
 

go中没有集合类型 > 用map来模拟

8.结构体

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
type Employee struct {
    ID int
    Name, Address string
    DoB time.Time
    Position string
    Salary int
    ManagerID int 
}

var dilbert Employee

# 相关操作
disbert.Salary += 5000
# 取得地址
position = &disber.Position
# 赋值
*position = "Senior" + *position

# 成员变量 可以包含指针类型
type tree struct {
    value int
    left, right *tree
}


# 可作为指针传递
func Bonus(e *Employee, precent int) int {
    return e.Salery * precent / 100
}

# 结构体成员变量首字母大写 > 可导出, 否则不可导出

# 匿名成员
type Point struct {
    X, Y int
}

type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Point
    Spokes int
}

var w Wheel
w.X = 8 # 等价于w.Circle.Point.X = 8