这是我参与「第五届青训营」笔记创作活动的第1天。
【1】Hello World
package main
main包,程序的入口包。
import (
"fmt"
)
标准库的fmt包,format,输入输出格式化字符串。
func main() {
fmt.Println("hello world")
}
main函数,fmt.Println函数输出。
运行:
go run main.go
编译成二进制:
go build
./main
【2】变量
强类型语言。
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
变量声明1,var 变量名 类型=值,类型可省略,自动推导。
f := float32(e)
变量声明2,变量名:=值。
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialfoo
字符串,加号+拼接,等于号==比较。
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
常量,没有确定的类型,根据上下文确定。
【3】if else
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")
}
条件没有小括号,大括号不可省略。
【4】循环
只有for循环。
for {
fmt.Println("loop")
break
}
死循环,可用break跳出循环,continue继续循环。
for j := 7; j < 9; j++ {
fmt.Println(j)
}
三段,都可省略。
for i <= 3 {
fmt.Println(i)
i = i + 1
}
循环条件。
【5】switch
switch a {
case 1:
fmt.Println("one")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
变量名没有小括号,每个case不需要break。
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
可代替 if else,switch后不写变量,case后写条件。
【6】数组
var a [5]int
fmt.Println("len:", len(a))
fmt.Println(a)
定义一维数组,获取数组长度,打印数组。
var twoD [2][3]int
fmt.Println("2d: ", twoD)
定义二维数组,打印数组。
数组长度固定,一般用切片。
【7】切片
切片,slice。
s := make([]string, 3)
make创建切片,s[0]取值,len(s)获取长度。
s = append(s, "e", "f")
fmt.Println(s)
append追加元素,赋值给原数组。
原理,存储长度、容量、指向数组的指针,容量不够会扩容。
c := make([]string, len(s))
copy(c, s)
fmt.Println(s[2:5])
fmt.Println(s[:5])
fmt.Println(s[2:])
创建时可指定长度,copy复制。
切片,区间左闭右开,不支持负数索引。
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
【8】map
m := make(map[string]int)
fmt.Println(m) // map[one:1 two:2]
make创建,键key的类型和值value的类型,m["one"]=1存取键值对,len(m)获取长度。
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
取值时要检查是否存在,delete删除键值对。
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
map完全无序。
【9】range
遍历slice或map。
nums := []int{2, 3, 4}
for i, num := range nums {
//..
}
遍历数组,i是索引,num是值,不需要索引可用下划线忽略。
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
//..
}
for k := range m {
//..
}
遍历map,k是键,v是值。