这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记
前言
参加青训营已经十来天了,终于有了一些知识沉淀
接下来的日子里我将逐步把自己的笔记制作成博客
希望能和大家一起学习和进步,也希望大家能对笔记中的不足之处加以指正,谢谢!—— IceClean
1. Go 的特点
对于 Go 语言,相信大家都已经有所耳闻甚至耳熟能详了
它是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言
那它相较于其他语言有什么特点呢?主要有如下:
- 部署简单
这一点和 Java 有很直观的比较
运行一个 Java 程序往往是非常麻烦的,例如 JVM、Tomcat 等基本上都是必须的环境
但 Go 的部署就清新很多了,除了 glibc 没有其他外部依赖
在编译之后是一个静态可执行文件,可以直接运行 - 天然支持高并发
Go 中的 Goroutine 和 Channel 从语言层面支持并发
在设计的时候就已经从语言层面高效利用多核(基于 CPS 并发模型实现) - 风格统一,追求简洁
Go 从语法设计最大程度地保证了编程风格的统一(有 go fmt 自动调整格式)
如函数体大括号的位置固定,不能出现没使用过的包和变量等等
除了以上这些,Go 还有很多优秀的特性,将在后边一点点和大家一起分享
2. 数据类型和变量
在 Go 中,基本数据类型有 6 中,而引用数据类型通常认为有 3 种
不管是全局还是局部变量,这些数据类型都有自己的零值
基本数据类型的零值有 0、false、"",而引用数据类型的零值都为 nil
接下来就一起详细看看这些数据类型吧~
① 基本数据类型
基本数据类型都是值类型,通常存放在栈中(可能会逃逸)
1) 整型族
标识:int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 byte
默认值全部为 0
▲ 含义:
int 或 uint 后边带的数字表示占用的字节数,而直接写 int 类型则会根据环境判断
若是 32 位 CPU 则占用 4 字节,64 位 CPU 则占用 8 字节
注意:这里并不是说 int 是 int32 或者 int64 的别名,它们是不同的类型
▲ 提示:
GoLang 中没有专门存储字符的,可以用 byte 来存储
例如中文字符('哈')可以使用 int 或者 uint 存储(使用 utf-8存放,可以用数组接收)
所以:所以字符是可以参与运算的
2) 浮点型族
标识:float32 float64
32 为单精度,64 为双精度,默认值都为 0
浮点型的默认声明为 float64,在程序中推荐都使用 float64
▲ 提示:
0.512 可以简写成 .512
也可以使用科学计数法,如 5.1234e2 = 512.34
e 大小写都可以,e 后部分也可以是负数
3) 布尔值
标识:bool
默认值为 false
4) 字符串
标识:string
默认值为 ""
▲ 注意:
string 是基本数据类型,它是由字节组成的
由于它本质上是字节数组,所以可以通过 stringName[index] 访问单个字符
同时字符串也是不可变的,不可以通过 stringName[0] = 'a' 去修改字符串,会报错
▲ 提示:
字符串可以用双引号或反引号括起来
其中双引号会识别转义字符
而反引号会以原生字符串形式输出(可以实现防御攻击,输出源代码等效果)
5) 数组
标识:[<size>]<type>
默认值为全部数组元素的零值
▲ 注意
在 Go 中数组是值类型(复合的基本数据类型)
也就是说,直接使用数组名,得到的是整一个数组的值,而不是数组的首地址
可以通过 &数组名 获得数组的首地址
6) struct 结构体
标识:type <name> struct {}
默认值为各属性的零值,地位相当于 class
结构体也是值类型,属于复合的基本数据类型
② 引用数据类型:
在引用数据类型中,变量存储的是一个地址,指向目标数据地址空间的首位
通常认为的引用数据类型会有:slice、map 和 channel
但事实上函数和接口应该也是引用数据类型
引用类型默认值都为 nil,下边就不详细标出了
1) slice 切片
标识:[]<type>
切片和数组的区别就是,前边的中括号写明具体的大小
它的底层是一个指针指向了一组变量,分别维护着长度 len、容量 cap 和指向真实存放值的数组头指针,通过 append 方法即可实现动态扩容
2) map 集合
标识:[<type>]<type>
在 Go 中,集合只有 map 一种,是一种键值对集合,中括号中的是键类型,外边的是值类型
访问值通过 <name>[<key>] 来进行
它的底层是一个哈希表,具体属性比较多这里就一一列出
3) channel 管道
标识:chan <type>
通过管道可以实现不同协程之间的通讯,是 Go 支持高并发的一个重要成员
一般情况下声明的管道是双向的,即既可读又可写
但在某些情况下我们需要限制管道为只写或者只读(通常出现在函数传参中)
可以将声明写为 <-chan(只读) 或 chan<- (只写),保证在指定的函数中只能对管道进行读或者写,避免函数内的误操作导致的错误
星之所在,心之所向