这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Go的语言特性
了解Go的特点,区分不同语言间的特点。
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
Go的基本语法
变量
声明变量基本有以下两种方式:
var/const声明,如var name string = "gypsophlia"。:=赋值声明,如name := "gypsophlia",自带类型推断。
变量基本类型包含以下:
- 整数类型,
int等。 - 浮点类型,
float等。 - 字符类型,
byte/rune,严格来说属于整数类型,字符可用单引号表示,如'c'byte=uint8,代表ASCII 码的一个字符。rune=int32,代表一个 UTF-8 字符,处理中文或者其他复合字符。
- 字符串类型,
string。字符串的字节使用utf-8编码标识Unicode文本。 - 布尔型,
bool。
判断
var a,b = 1,2
if a == b {
print("OK")
}
循环
- 没有
while关键字
for a != b {
...
}
for i := 0; i < 10; i++ {
...
}
分支
- 不需要写
break switch后支持各种变量类型switch也可以单纯作为多层判断的缩写
switch name {
case "john":
...
default:
...
}
switch {
case a > b:
...
case a < b:
...
default:
...
}
数组和切片
关于数组和切片有许多值得注意的地方,先看分别的创建方式:
// 数组
var arr0 [2]int
arr1 := [2]int{1,2}
arr2 := [...]int{1,2}
// 切片
arr3 := []int{1,2}
arr4 := make([]int, 3)
arr5 := make([]int, 3, 10)
你可以查看这里的代码来搞清楚数组和切片的一个重要区别:数组是值拷贝,切片是指针拷贝。
Map
map是一种哈希结构,而在多并发的go程序中常常需要考虑并发安全的问题,因此在此之上有一些并发安全的哈希表,如sync.Map等,可自行查阅。
var dict map[string]string
dict["a"] = 1
dict["b"] = 2
val, ok := dict["c"]
if ok {
...
}
指针
Go中同样存在着指针的用法,可用性不如C/C++上的指针,但也有类似的问题,如:函数传值和函数传指针。不再多言。
结构体
基本需要掌握结构体的声明、结构体函数绑定、结构体初始化。
同时结构体中可以使用tag的语法,有助于JSON格式还。
结构体初始化的方式有很多,可以自行探索。
type User struct {
Name string `json:"name"`
Age int
}
func (u User) isAdult() bool {
return u.Age > 18
}
func (u User*) growUp() {
u.Age += 1
}
req := User{Name:"gypsophlia"}
错误处理
错误通常作为返回值返回,并每次进行判断。
func divide(a int, b int) (int, error) {
if b == 0 {
return 0, errors.New("zero can't be divided.")
}
return a/b, nil
}
res, err := divide(10, 13)
if err != nil {
...
}
常用模块
strings字符串操作strconv字符串和数字解析jsonJSON解析time时间解析