初心是记录和总结,自己学习Go语言的历程。如果能帮助到你,这是我的荣幸。
前言
Go语言的数据类是: 值类型和 派生类型
从常规来说,一般编程语言的数据都可以分成两种类型:
- 基本数据类型
- 引用数据类型
其中基本数据类型,是指不需要从内存中开辟空间,因为内存大小已经固定,定义后可以直接赋值进行初始化使用;而引用数据类型是内存大小不确定,需要从内存中开辟空间后才能进行赋值和其他操作。介绍这个只是帮助我们去了解Go语言的类型。
Go语言的值类型就好比基本数据类型,定义后直接赋值;但Go语言的派生类型就不能用引用类型一概而论了
值类型
Go语言有如下常用的值类型
类型 | 长度(字节) | 默认值 | 说明 | |
---|---|---|---|---|
bool | 1 | false | 布尔 | |
byte | 1 | 0 | uint8 | |
rune | 4 | 0 | Unicode Code Point, int32 | |
int, uint | 4或8 | 0 | 整型;32 或 64 位 | |
float32 | 4 | 0.0 | ||
float64 | 8 | 0.0 | ||
array | 数组 | |||
string | “” | UTF-8 字符串 |
派生类型
我想Go语言这样划分类型,可能是这样想的:简单的类型-值类型
;复杂的类型-派生类型
,我们依然带着有些类型是需要开辟内存的思想,再给派生类型分一下,方便记忆
- 引用类型:
slice
、map
、chan
- 接口:
interface
- 函数:
func
- 指针
- 结构体
这里我们先知道在Go语言中是有这样一些派生类的存在,在这并不展开详细介绍。
开辟空间方式
学过面向对象思想的,我们应该懂得通过new
关键字在内存开辟空间给指定类型。虽然Go语言并不是面向对象的语言,但是Go语言为我们提供了两种内存分配的方式:
- new:
func new(Type) *Type
- make:
func make(t Type, size ...IntegerType) Type
通过定义,可以了解到new
比较容易理解:给定一个类型,返回的是指向该类型的指针。而make
我们通过官方包介绍来看一下:
解读:
我们再次摘录下它的函数定义,方便我们理解:func make(t Type, size ...IntegerType) Type
首先,make
函数是专门为了给slice
、map
、chan
这三种类型分配内存并初始化。函数的参数:
t Type
表示类型size
表示长度...IntegerType
表示容量
例如:
make([]int, 0, 10) // 大小为10,并返回一个长度为0、容量为10的切片
make(map[string]int, 8) // 分配容量为8的,存放key为string类型的,value为int类型的map
make(chan int, 8) //缓存区大小为8,传递整型的通道
我们有提到make
可以初始化。所以,通过make
函数创建的类型已经自动帮我们初始化了。
顺便提一嘴,在Go语言中空表示为nil
,所以slice
、map
、chan
默认定义后未分配内存时都是为nil
,对nil
操作的时候会报错。这就体现出make
的好处来了。