这是我参与「第五届青训营」笔记创作活动的第1天。
一、本堂课重点内容
- Go语言简介
- Go语言开发入门,包括开发环境配置、基础语法、标准库
- Go实战,包括三个实战项目
二、详细知识点介绍
Go语言的特点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台:支持交叉编译
- 垃圾回收:无需考虑内存释放
Go语言开发入门
数组:
a := [5]int{1,2,3,4,5}
切片:
good := []string{"g","o","o","d"}
// 切片存储的是长度+容量+指向数组的指针,容量不够时会自动扩容(加倍)
s := make([]string,5)
fmt.Println(s[2:]) //切片的截取:左闭右开,截取第2,3个元素
range快速遍历:
for i, num := range nums{...}
for k, v := range m{ ... }
指针: go语言中只有值传递,要想在函数内部修改传入参数的值,则需要传入指针
字符串:
格式化打印:
type point struct {
x,y int
}
p := point{1,2}
fmt.Printf("p=%v\n",p) // p={1 2}
fmt.Printf("p=%+v\n",p) // p={x:1 y:2}
fmt.Printf("p=%#v\n",p) // p=main.point{x:1, y:2}
JSON处理:
json.Marshal(...)
json.Unmarshal( ... )
要序列化的结构体,其成员变量要大写(公有),因为是通过反射获取的信息。可以用tagjson:name,来标注成员变量转化为json的tag。
时间处理:
数字解析:
三、实践练习例子
1.guessing-game 猜谜游戏
使用fmt.Scanf来简化代码实现
2.simpledict 命令行词典
增加另一种翻译引擎的支持,实现并行请求两个翻译引擎来提高响应速度
3.proxy SOCKS5 代理
熟悉SOCKS5协议
四、课后个人总结
易混淆知识点——var,:=,new(),make()的区别
1.var 变量声明,多用于全局变量
var name type
定义一个 type 类型的变量 name,并分配内存空间给 name 赋 type 类型的零值。
var name *type
定义一个 type 类型的指针变量 name,指针变量不分配内存空间,零值为 nil。
2.:= 简短声明,多用于局部变量
i := 5
声明一个 int 型变量 i,分配内存空间并赋值。
i := 5.5
声明一个 float64 型变量 i,分配内存空间并赋值。
i := false
声明一个 bool 型变量 i,分配内存空间并赋值。
i := "Golang"
声明一个 string 型变量 i,分配内存空间并赋值。
type dog struct {
name string
age int
}
// 等同于i := dog{"xiao", 5}
i := dog{
name: "xiao",
age : 5}
声明一个 dog 型变量 i,分配内存空间并赋初值。
3.new() 分配内存函数,返回内存地址
var i *int
i = new(int)
or
i := new(int)
声明一个 int 型指针 i,分配一个 int 的内存空间,并把内存地址给 i。
4.make() 分配内存函数,仅用于 chan、map 和 slice,返回的数据类型就是这三个类型本身
func make(t Type, size ...IntegerType) Type
chan、map 和 slice 这三种类型本身就是引用类型,所以没必要返回指针类型
5.用法总结
凡遇到 chan、map 和 slice 就用make()
make(chan int, 1)
make(map[string]int, 5)
make([]string, 5)
其余情况用 := 或者 var 就能解决,可以不用 new()
i := 0
f := 0.0
b := false
str := ""
p := person{}