前言

前面学习了Go数据类型中的数字、字符串,下面看看Go中是否有Python中的list、dict等复合数据类型?

需要注意的是在Go中数组是可变类型+值(拷贝)类型,而go中切片是引用类型;

数组声明之后它里面的元素是可以被修改,如果把1个数组变量引用到1个新的变量,那么这个新的变量会重新拷贝一份旧数组的数组。

Python中的list是可变+引用数据类型

Golang中的arry是可变+拷贝数据类型

 

Python的list切片之后会开辟1开新的内存生产1个新的list数据类型

Golang的arry切片之后会开辟1个新的内存生成1个slice数据类型

 

  

 

数组

数组就是存放同1种数据基本数据类型(数值,字符、字符串、布尔值)元素的容器。

Go中的数组有一下特点:

在声明arry变量时就要声明arry的长度、容器内存放元素的数据类型;

数组的长度是数据类型的1部分,所以2个长度不同arrr,即使他们都属于数组,但2者的数据类型完全不一致,所以2者无法相互比较和赋值。

数组如果没有初始化里面的元素默认为0值(bool=false,int or float=0, string=空字符串)

 

 

数组的声明和初始化

 

  

遍历数组

 

 

  

多维数组

多维数组就是数组里面嵌套数组

 

数组的内存管理机制

 

Golang字符串类型存储的机制

 

我们在Golang中声明的字符串类型变量,编译器不会直接存储该字符串的值。

而是先开辟1块内存把字符串的值存储起来,然后开辟1块内存把这个字符串的指针(8个字节)和长度(8个字节)存储起来赋予变量。

为什么要这样存储1个字符串呢?额外开辟1块存储指针和长度的内存空间。

我感觉这是是为了字符串被放到到Arry或Slice之后的查询效率而做的铺垫。

 

1.数组的内存地址是连续的

2.数组的内存地址=数组中第1个元素的内存地址

这种设计可以让我们快速的从1个元素获取到数组中最后1个元素,查询效率大大提升。

既然声明1个数组即开辟了1块连续的内存,对Arry中的item进行顺序存储,那么Arry的item含有字符串呢?

3.声明1个字符串数组时,开启一段连续的内存之后,(并不会在这段连续的内存上直接存储字符串的值,而是存储字符串值的指针(占4个字节)和长度(占4字节)=16个字节。这也是Golang中字符串数据类型的存储机制,连续的内存+指针=加快查询效率...)

这样Arry中每1个元素对这段连续内存的使用都有了固定的规格,节约了Arry对内存空间占用。

随意字符串存储时增加了额外的空间去存储指针和长度,但是加速了查询效率。用空间换时间吧!

 

 

 

Go中多维数组是数值类型不是引用类型

 值类型:就是重新开辟新的内存,与引用类型相反

  

 练习题