持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
初心是记录和总结,自己学习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的好处来了。