13 map集合
1 | package main |
1 | package main |
1 | package main |
1 | package main |
1 | package main |
且看官网文档:
- 数组:https://wizardforcel.gitbooks.io/golang-doc/content/37.html
- 切片:https://wizardforcel.gitbooks.io/golang-doc/content/37.html
参考链接
- 一维数组
- 定义:
var variable_name [SIZE] variable_type
- 初始化:
var balance = [5]int{1, 2, 4, 5, 3}
var balance = []int{1, 2, 4, 5, 3}
- 多维数组:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
、- 数组指针:
var a * [3] int
- 指针数组:
var a [3] * int
定义
var identifier []type
,切片不需要说明长度
var slical []type = make([]type, len)
slical := make([]make, len)
指定切片的容量,可以不写,要求
length <= capacity
make ([]T, length, capacity)
- 数组是
值类型;
切片是引用类型
- 数组做函数参数,拷贝一个数组传递;切片是指向一个数组切片的指针
- 数组的长度也是
Type
的一部分;切片总是指向底层的数组的数据结构
由于Go的数组
1 | package main |
1 | a = &[1 2 3], b = &[1 2 3] |
论证结果
数组是
值类型;
切片是引用类型
1 | package main |
本来打算在外面定义一个全局变量
var itp int
,用来存储new
申请的内存空间的地址,然后把地址传递出去,再在main
函数中做类型转换,访问这块内存空间,如果程序崩溃,则恰恰说明说明了tp
没有逃逸出函数,思路如下:
itp = (int)tp
==>p2itp = (* int)itp
- 第一个是拿到
tp
的内存地址空间,做类型转换的时候失败了编译器不允许这种操作,int32, int64, uint, uint32, uint64, uintptr
都试过了也不行,通过这种方式拿到的地址没有产生指针指向访问
所以变量的不会逃逸出函数- 第二个是拿到
tp
的值,再做类型转换,进行访问内存空间(读/写访问)
如果程序崩溃掉了,则说明tp
没有逃逸出函数- 不过上面的两步都不行,第一个虽然不能转换成功,但是可以通过
fmt.Printf
打印地址,可以得到地址值,然后再通过fmt.Scanf
重新存储到变量itp
中,但是第二步就不可以了,即使通过查内存的方式也无法验证,因为读取内存内容不一定引起程序的崩溃。必须通过读/写
访问才可以完整的验证。
1 | package main |
1 | package main |
1 | package main |