2020-01-06 Go语言学习日记:复合类型(指针、数组)、随机数、切片

复合类型

指针

var a int = 10
var p *int
p = &a//将a的地址赋给p
*p = 666//操作的不是p的内存,而是p指针所指向的内存
  • 保存某个变量的地址
  • *int 保存int的地址, **int保存 *int 的地址
  • 默认值为nil,而不是null
  • 操作符&去变量地址,*通过指针(地址)访问目标对象
  • 不支持指针运算,不支持->运算符,直接用.访问目标成员

new函数

var p *int
p = new(int)
*p = 666
------------
q := new(int)
*q = 777

通过new(希望存储的类型)来动态创建一个空间,类似于C语言的malloc

  • 只需要关心创建即可,无需担心其内存的生命周期或怎样删除,因为go语言内存管理会自动清理

若希望函数内修改值会影响传入参数,则应当使用指针传参,否则传入参数的值不会改变—参考C语言栈内存模型

func swap(a, b *int) {
	*a, *b = *b, *a
}

func main()  {
	var a, b int = 10, 20
	swap(&a, &b)
}

数组

//声明
var nums [5]int
//全部初始化
var nums [5]int = [5]int{1, 2, 3, 4, 5}
nums := [5]int{1, 2, 3, 4, 5}
//部分初始化,没有初始化的部分自动赋值为0
var nums [5]int = [5]int{1, 2, 3}
nums := [5]int{1, 2, 3}
//指定某个元素初始化
var nums [5]int = [5]int{2:10, 4:20}
nums := [5]int{2:10, 4:20}
  • 数组元素个数必须是常量,也就是说不能传输变量!
  • [5]int这个相当于一个类型
  • 二维数组申明括号需要在同一行。例如:
//错误展示
nums := [2][2]int{
	{1, 2},
	{3, 4}
}
//正确展示
nums := [2][2]int{{1, 2}, {3, 4}}
  • 数组支持比较==!=,比较的是两个数组的数组类型,和每个元素是否相同
  • 同类型的数组可以直接使用=赋值

数组做参数

//传递需要规定数组大小,也就是需要设置数组类型
//数组是作为值的传递,函数中值改变不会改变函数外的数组
//形参的数组是实参的数组的复制品
func ChangeArray(nums [5]int)  {

}

指针数组做参数

//传递需要规定数组大小,也就是需要设置数组类型
//指针是地址传递,函数内修改会影响到函数外部
func ChangeArray(nums *[5]int)  {
	(*nums)[0] = 1
}

随机数

//设置种子
rand.Seed(time.Now().UnixNano())
//产生在多少以内的随机数
randNum = rand.Intn(100)

切片

切片并不是数组或指针,它通过内部指针和相关属性引用数组片段,以实现变长方案
是引用
底层原理(是数组):在这里插入图片描述
在这里插入图片描述

切片创建

//创建方式
//创建一个可变长切片
slice := []int{}
//使用make(类型,长度,(容量))创建,容量默认为和长度相等
slice := make([]int, 5, 10)
  • 可变长,是引用

切片截取

slice := array[low: high: max] (三个参数均可省略)
要求:low <= high <= max <= len(array)
第一个参数:下标的起点(包括本身)(省略就说明为0)
第二个参数:下标的终点(不包括本身)(省略就说明为len(array))
第三个参数:最大可达下标(不包括本身)(省略就说明为len(array) - low)
长度:len = high - low //len(slice)的值为 high - low
容量:cap = max - low //cap(slice)的值为 max - low (用于切片扩充append())
注意!:这种方式获得的类型为引用,也就是说切片修改,源数据也会改变

append()方法

给切片末尾增加一个数据

slice = append(slice, 0)//slice = [0]
扩容特点
  • 每次增加长度都会加一
  • 容量以两倍的形式进行增长扩容:重新分配底层数组,并复制原来的数据(原因?)
  • 按照二倍增长后capacity依然不够用时,会将capacity设置为当前数组的length+1
    例如:
var number []int{}
numbers = append(numbers, 1, 2, 3, 4, 5)//len = 5   cap = 6

copy()方法

将源切片的数据从目的切片0位开始复制,返回the number of elements copied, which will be the minimum of len(src) and len(dst).

srcSlice := []int{2, 3}
dstSlice := []int{6, 6, 6, 6}
copy(dstSlice, srcSlice)//num = 2  dstSlice = {2, 3, 6, 6}
copy(srcSlice, dstSlice)//num = 2  dstSlice = {6, 6, 6, 6}

切片做函数参数

  • 函数中形参发生改变会影响到函数外的实参
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值