GoLang 基础详解(1)—— 特点和数据类型|青训营笔记

173 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记

前言
参加青训营已经十来天了,终于有了一些知识沉淀
接下来的日子里我将逐步把自己的笔记制作成博客
希望能和大家一起学习和进步,也希望大家能对笔记中的不足之处加以指正,谢谢!

—— IceClean

1. Go 的特点

对于 Go 语言,相信大家都已经有所耳闻甚至耳熟能详了
它是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言
那它相较于其他语言有什么特点呢?主要有如下:

  1. 部署简单
    这一点和 Java 有很直观的比较
    运行一个 Java 程序往往是非常麻烦的,例如 JVM、Tomcat 等基本上都是必须的环境
    但 Go 的部署就清新很多了,除了 glibc 没有其他外部依赖
    在编译之后是一个静态可执行文件,可以直接运行
  2. 天然支持高并发
    Go 中的 Goroutine 和 Channel 从语言层面支持并发
    在设计的时候就已经从语言层面高效利用多核(基于 CPS 并发模型实现)
  3. 风格统一,追求简洁
    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<- (只写),保证在指定的函数中只能对管道进行读或者写,避免函数内的误操作导致的错误


星之所在,心之所向

—— IceClean