博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言学习---数组和切片(Slice)
阅读量:5244 次
发布时间:2019-06-14

本文共 2229 字,大约阅读时间需要 7 分钟。

切片---数组的抽象

对比数组:

1.Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

 

定义数组和切片

// 声明一个长度固定的数组 var variable_name [SIZE] variable_type var balance [10] float32
var balance = [5]float32{ 1000.0, 2.0, 3.4, 7.0, 50.0}
var balance = [...]float32{ 1000.0, 2.0, 3.4, 7.0, 50.0}
// 声明一个未指定大小的数组来定义切片var identifier []type// 切片不需要说明长度。// 或使用make()函数来创建切片:var slice1 []type = make([]type, len)// 或slice1 := make([]type, len)// 也可以指定容量,其中capacity为可选参数。// 这里 len 是数组的长度并且也是切片的初始长度。make([]T, length, capacity)

 

切片初始化

// 直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3s :=[] int {
1,2,3 } // 初始化切片s,是数组arr的引用s := arr[:] // 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片s := arr[startIndex:endIndex] // 缺省endIndex时将表示一直到arr的最后一个元素s := arr[startIndex:] // 缺省startIndex时将表示从arr的第一个元素开始s := arr[:endIndex]// 通过切片s初始化切片s1s1 := s[startIndex:endIndex] // 通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片s :=make([]int,len,cap)

 

len() 和 cap() 函数

len() :

切片是可索引的,并且可以由 len() 方法获取长度。

cap():

切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少

实例:

package mainimport "fmt"func main() {    // var numbers = make([]int, 3, 5)    numbers := []int {
1,2,3} printSlice(numbers)}func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)} // 输出结果 // len=3 cap=5 slice=[0 0 0] or len=3 cap=3 slice=[1 2 3]
 

 

空(nil)切片

一个切片在未初始化之前默认为 nil,长度为 0

 

append() 和 copy() 函数

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。

package mainimport "fmt"func main() {   var numbers []int   printSlice(numbers)   /* 允许追加空切片 */   numbers = append(numbers, 0)   printSlice(numbers)   /* 向切片添加一个元素 */   numbers = append(numbers, 1)   printSlice(numbers)   /* 同时添加多个元素 */   numbers = append(numbers, 2,3,4)   printSlice(numbers)   /* 创建切片 numbers1 是之前切片的两倍容量*/   numbers1 := make([]int, len(numbers), (cap(numbers))*2)   /* 拷贝 numbers 的内容到 numbers1 */   copy(numbers1,numbers)   printSlice(numbers1)   }func printSlice(x []int){   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)}

以上代码执行输出结果为:

 
len=0 cap=0 slice=[] len=1 cap=1 slice=[0] len=2 cap=2 slice=[0 1] len=5 cap=6 slice=[0 1 2 3 4] len=5 cap=12 slice=[0 1 2 3 4]
 

 

转载于:https://www.cnblogs.com/Paul-watermelon/articles/10373355.html

你可能感兴趣的文章
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
python-三级菜单和购物车程序
查看>>
条件断点 符号断点
查看>>
水平垂直居中
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
【codevs1033】 蚯蚓的游戏问题
查看>>
【程序执行原理】
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>