这是我参与「第五届青训营」伴学笔记创作活动的第 1 天。 今天课程的主要内容是 Go 语言的基础。下面是我的主要内容笔记整理。
变量
声明:
-
var 变量名 类型 -
:=根据值类型自动推变量类型,eg:`a, b = 9Golang 是强类型语言,所有变量必须拥有类型,且变量仅仅可以存储特定类型的数据
-
标识符为
_是匿名变量 -
const常量,不能用:=
if else
if 条件不用小括号,仍要大括号,且允许判断条件之前执行一个简单语句,并用分号 ; 隔开
if v := main.Pow(x, n); v < lim{
return v
}
循环
Golang 只有一种循环:for,条件不需要小括号
初始化和后置语句是可选的,去掉分号,for 循环 变 while
for sum < 1000{
sum += sum
}
省略条件,循环不会结束,等同于 while(true)
for{
...
}
switch
Go 中每个 case 执行结束默认 break
如果希望从某个 case 顺序往下执行,可以使用 fallthrough 关键字
数组
数组定义:
var a[10] int
var strAry = []string{"aa", "bb", "cc", "dd", "ee"}//不指定初始个数也可以
数组大小不能改变
切片
数组大小固定,切片为数组元素提供动态大小
通过两个下标来界定,区间左闭右开
a[low : high]
eg:
a[1:4]
//包含 a 中下标从 1 到 3 的元素
map
map 是 key-value 的键值对存储结构,key 不能重复,底层用 hash 表存储
//字典初始化
var dic = map[string]int{
"apple":1,
"watermelon":2,
}
fmt.Printf("dic %+v\n", dic)
//创建
map [KeyType]ValueType
var m map[int]int
m := make(map[int]int)
m := map[int]int{
1:1,
2:2,
}
//读取
i := m[1]
v,ok := m[1]
//遍历
for key,value := range m{
println("Key:", key, "Value:", value)
}
//删除
delete(m,1)
range
快速遍历 slice 或者 array,如
m := map[string]string{"a": ”A", "b": "B"}
for k, v := range m{
fmt.Println(k, v)
}
函数
func 开头,驼峰命名法
首字母小写,包内使用;大写可以包外引入。
即小写
private,大写public
函数可以不接受参数,嚯接受多个参数
先变量名,再类型,再返回值类型
相同类型的两参数,类型可以只写一个
Golang 中函数可以返回任意多个返回值
函数返回值能命名
空的 return 语句默认返回所有已经定义的返回变量
defer 将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前函数都不会被调用
指针
& 取地址,*取地址中的值
没有指针运算
结构体
近似地认为:一个结构体就是一个类,结构体内部的字段,就是类的属性。
组成结构体类型的数据成为字段。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的
结构体中同样遵循大小写设置公有私有,结构体内字段也是
结构体方法
方法是一种特殊的函数
在 func和函数名 之间,加上接收者的类型
错误处理
用 error 包,多返回一个 err
JSON 处理
用 encoding/json包,结构体保证第一个字母大写,能用 json.Marshal()序列化,之后需要 string强转字符串
时间处理
time包,使用和 C++ 差不多
数字解析
strconv包,实现字符串与数字之间的转换。
strconv.ParseFloat("数字",进制,精度)
strconv.Atoi("数字"),直接转 int
进程信息
os包和os/exec包
os.Args获取进程执行时的命令行参数
os.Getenv或者os.Setenv获取或写入环境变量‵
exec.Command快速获取子进程及获取输入输出