Go语言基础 | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
1. 简介
1.1 什么是Go语言
Go语言是由谷歌出品的开发的一种静态强类型、编译型语言
特点:
-
高性能、高并发
有与c++、java等相媲美的高性能;不同于其他语言以库的形式支持高并发,只需要使用标准库或者任意基于标准库的第三方库即可开发高并发应用程序。
-
语法简单、学习曲线平缓
Go语言在c语言的基础上进行了大幅度的简化,去掉了不需要的表达式括号,循环也只有for这一种表示方法。一个熟练的Go开发者只需要短短一周时间就可以从学习阶段到开发阶段。
-
标准库丰富
有着功能完善、质量可靠的标准库。大多数情况下只需要使用官方的标准库就可以完成基础功能的开发,大大降低了学习和使用成本。标准库有很高的稳定性和兼容性保证,还能持续享受语言迭代带来的性能优化,这是第三方库所不具备的。
-
完整的工具链
Go语言在诞生之初,就拥有丰富的工具链。无论是定义、代码格式化、错误检查、帮助文档、包管理、代码补充检查都有对应的工具供开发者使用。Go语言还内置了完整的单元测试框架,支持单元测试、性能测试等功能。
-
静态链接
Go语言内所有的编译结果都是静态链接的。只需要拷贝编译后的唯一一个运行文件就可以部署运行,非常方便快捷。
-
快速编译
Go语言拥有静态编译语言里几乎最快的编译速度。
-
跨平台
Go语言的代码可以在任何平台上编译,也可以在任何服务器和应用程序上编译。
-
垃圾回收
Go语言是一门带垃圾回收的语言。和Java类似,不需要考虑内存的分配释放。
1.2 哪些公司在使用Go语言
字节跳动、Google、腾讯、facebook、美团、滴滴、百度、bilibli、七牛云、PingCAP等
2. 入门
2.1 开发环境
-
安装Golang
-
配置IDE
2.2 基础语法
2.2.1 整数类型
整数类型包括有符号整数int、int8、int16、int32、int64等;
无符号整数uint、uint8、uint16、uint32、uint64等;
其中int和 uint,它们分别对应特定 CPU 平台的字长(机器字大小)。
Unicode 字符的rune类型和int32类型是等价的,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样,byte和uint8也是等价类型byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。
还有一种无符号的整数类型uintptr,它没有指定具体的 bit 大小但是足以容纳指针。uintptr类型只有在底层编程时才需要。
2.2.2 浮点类型
Go语言提供了两种精度的浮点数float32和float64。
| 浮点数极限值 | MIN | MAX |
|---|---|---|
float32 | 1.4e-45 | 4.9e-324 |
float64 | 3.4e38 | 1.8e308 |
其中最大值和最小值可以通过常量 math.MaxFloat32获得。
一个float32类型的浮点数可以提供大约 6 个十进制数的精度,而float64则可以提供约 15 个十进制数的精度,通常优先使用float64。
2.2.3 字符类型
Go语言的字符有以下两种:
- 一种是
uint8类型,或者叫byte型,代表了 ASCII 码的一个字符。 - 另一种是
rune类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型等价于int32类型。
byte类型是uint8的别名。
2.2.4 字符串
一个字符串是一个不可改变的字节序列,字符串可以包含任意的数据,但是通常是用来包含可读的文本,字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码表上的字符时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。
可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果,常用的转义字符包括:
使用`反引号可以定义多行字符串
2.2.5 声明方式
var name type //标准声明格式
//批量声明格式
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
a := 1 //名字 := 表达式。用法同auto,通过右值自动判断声明类型
i,s := 0,"aaa"
2.2.6 变量默认值
- 整型和浮点型变量的默认值为 0 和 0.0。
- 字符串变量的默认值为空字符串。
- 布尔型变量默认为 bool。
- 切片、函数、指针变量的默认为 nil。
2.2.7 循环
Go语言中循环只有for语句,循环的括号体去除
for a := 0;a<10;a++{
// 循环代码
}
for {
// 循环代码
}
for i,v:= range list{
//循环代码
}
2.2.8 条件分支
省略掉了表达式括号体。
if 表达式{
// 表达式成立
}else{
// 表达式不成立
}
switch语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。
switch a{
case 1:
case2:
default:
}
2.2.9 数组
数组的长度固定,不能改动
var a [10]int //声明数组
arr[0] = 41 //数组元素赋值
b := [2]int{2,3} //简短声明同时赋初值
2.2.10 切片
可以理解为'动态数组'。但slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层 array,,只是不需要长度。
var slice []int
slice := []byte {'a', 'b', 'c', 'd'}
a = slice[1:2] //{'b', 'c'},a 指向数组的第1个元素开始,并到第2个元素结束
2.2.11 map
var ma map[string]int //声明一个key为string,value为int的map
声明不会分配内存,初始化需要make,分配内存后才可以赋值和使用。
a := make(map[string]int)
a["xxxx"] = 222 //赋值
通过map的第二个参数ok来判断是否存在对应的key。
item, ok := ma['first']
2.2.12 函数
本例中int为参数,string为返回值
func ffff(a int, b int) string{
(函数内容)
}
2.2.13 指针
Go语言中指针只能用来传递数据和修改数据,不能进行指针运算。
func add1(x *int){
*x++
}
func main(){
x := 2
add1(&x)
}
2.2.14 结构体和方法
使用指针可以对结构体修改
//结构体声明
type student struct{
id int
name string
}
s := student{233, "Tom"}//初始化
s := student{name:"Daming",id:123}//另一种初始化方法
//student结构体的一个方法
func (student)getName(id int) string{
(函数内容)
}
2.2.16 错误处理
与java使用try...catch...抛出异常不同,Go语言使用error来进行错误处理
ver, err := reader.ReadByte()
if err != nil {
return fmt.Errorf("read ver failed:%w", err)
}
3.总结
今天是青训营的第一天,今天学到了Go语言的基础语法,还通过三个项目进行了实战,巩固了学习内容。感觉本系列课程内容干货满满,我会在课下继续学习,提高技术水平。