Go语言基础-基础语法 | 青训营笔记

111 阅读3分钟

这是我参与「第五届青训营」笔记创作活动的第1天。

一、本堂课重点内容

  1. Go语言简介
  2. Go语言开发入门,包括开发环境配置、基础语法、标准库
  3. Go实战,包括三个实战项目

二、详细知识点介绍

Go语言的特点

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台:支持交叉编译
  8. 垃圾回收:无需考虑内存释放

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语言中只有值传递,要想在函数内部修改传入参数的值,则需要传入指针

字符串:

1-1.png

格式化打印:

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-2.png

数字解析:

1-3.png

三、实践练习例子

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{}

五、引用参考

var,:=,new(),make()的区别

我完成的作业