GO数组和切片

在学习go基础语法时,遇到两种数据类型:数组和切片。感觉容易混淆,特别记录一下。

1、描述

(1)数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。

数组是值类型,将一个数组赋值给另一个数组时将复制一份新的元素

(2)切片

切片是对数组的抽象。

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

切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。
即当一个切片作为参数传递给一个函数时,函数对该切片的修改在函数外部也可以看到。

2、定义与初始化

slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用…自动计算长度,而声明slice时,方括号内没有任何字符。

(1)数组

数组声明需要指定元素类型及元素个数

var variable_name [SIZE]variable_type
//例如:
var array [10]int

初始化数组:

var array = [5]int{1, 2, 3, 4, 5} //初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
var array1 = [...]int{1, 2, 3, 4, 5}//如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小

(2)切片

声明一个未指定大小的数组来定义切片:

//(1)
var identifier []type
//例如:
var numbers []int //切片不需要说明长度。
//(2)使用make
var slice1 []type = make([]type, len, cap)

初始化切片:

s :=[] int {1,2,3 }  //直接初始化切片
s := arr[:]  // arr是数组,可以从arr初始化切片s,是数组arr的引用
s1 := s[startIndex:endIndex] //s是切片,切片s初始化切片s1

注意以下代码:

	var slice []int
	var array = [...]int{1, 2, 3, 4, 5}
	slice = array[1:3]  #slice:[2 3]
	slice[0] = 10 # slice:[10 3] array:[1 10 3 4 5]

slice是数组array的引用 ,当slice修改后,array也跟着发生了变化。

切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。对切片进行的任何修改都将反映在底层数组中

3、切片相关操作

切片用得比较多,因此了解一下切片相关的操作。

(1)copy()

	var slice []int
	var array = [...]int{1, 2, 3, 4, 5}
	slice = array[1:3]
	slice2 := make([]int, len(slice), cap(slice))
	copy(slice2, slice)
	slice[0] = 10

注:必须创建一个新的至少比原切片更大的切片,才能把原分片的内容都拷贝过来。
拷贝后,原切片的修改不影响新切片。

(2)append与… 操作符

append() 用于追加元素

	var slice []int
	var array = [...]int{1, 2, 3, 4, 5}
	slice = array[1:3]  //slice :[2 3]
	slice2 := append(slice, 10) //slice :[2 3]  slice2 :[2 3 10]
	slice3 := append(slice, slice2...)//slice :[2 3]  slice2 :[2 3 10]  slice3: [2 3 2 3 10]

(3)len() 和 cap() 函数

  • len():获取切片长度
  • cap(): 获取切片容量

(4)切片元素的删除和插入操作

删除头部元素

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

删除尾部元素

    var slice = []int{1, 2, 3, 4, 5}
	slice = slice[:len(slice)-1]

删除中间元素

    var slice = []int{1, 2, 3, 4, 5}
	slice = append(slice[:1], slice[3:]...)

插入头部元素

    var slice = []int{1, 2, 3, 4, 5}
	slice = append([]int{10}, slice...) //[10 1 2 3 4 5]

插入中间元素

var slice = []int{1, 2, 3, 4, 5}
	rear := append([]int{}, slice[2:]...) //保存后部剩余元素,必须新建一个临时切片
	slice = append(slice[:2], 10) 
	slice = append(slice, rear...)
	printSlice(slice)

更多

发布了25 篇原创文章 · 获赞 0 · 访问量 535
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览