3.切片使用以及内存优化

切片

切片是一个新的数据类型, 与数组最大的区别在于, 切片的类型字面量中只有元素的类型, 没有长度

因此切片是一个长度可变的, 同一类型的元素集合, 切片的长度可以随着元素数量的增加而增长, 但不会随着元素减少而减小

创建切片

创建切片有三种办法. 基于数组, 切片和直接创建

基于数组

array := [...]{1, 2, 3, 4, 5}
s1 := array[1:4] // [2 3 4]

切片的底层引用了一个数组, 由三部分构成: 指针, 长度和容量. 指针指向数组的起始下标, 长度对应切片中元素个数, 容量则是切片起始位置到底层数组结尾的位置

因此, 切片的长度不能超过容量
在这里插入图片描述

基于切片

s2 := s1[:2] // [2 3]

直接创建

创建长度为3的整型切片

slice := make([]int, 3)

创建长度为3, 容量为5的整形切片

slice := make([]int, 3, 5)

包含初始元素的切片, 长度和容量都为3

slice := []int{1, 2, 3}

内存优化

切片持有怼底层数组的引用. 只要切片在内存中, 数组就不会被垃圾回收

使用copy函数func copy(dst, src[]T) int来生成一个切片副本, 原始数组就可以被垃圾回收

package main

import "fmt"

func counties() []string {
	countries := []string{"USA", "Singapore", "Germany", "India", "Australia"}
	needCountries := countries[:len(countries)-2]
	countriesCopy := make([]string, len(needCountries))
	copy(countriesCopy, needCountries)
	return countriesCopy
}

func main() {
	countriesNeeded := counties()
	fmt.Println(countriesNeeded)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值