栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Go语言学习-- No.9 内置容器(数组、切片和映射)------切片

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go语言学习-- No.9 内置容器(数组、切片和映射)------切片

内置容器(切片)
  • 切片
    • 声明切片的方法
    • 从数组中生成切片
    • 初始化切片
    • 直接声明切片并进行make初始化操作
    • 为切片添加元素
    • 对切片的操作也会影响产生它的数组随之进行变化
    • 通过切片删除元素
    • 遍历切片
  • 总结

切片

切片(slice)表示多个同类型元素的连续集合,但是切片本身并不存储任何元素,而只是对现有数组的引用。
切片结构包括:地址、长度和容量。
切片主要有三种生成方式:

  1. 从数组生成一个新的切片;
  2. 从切片生成一个新的切片;
  3. 直接生成一个新的切片。
    这里的切片类似于 python中的切片的概念 ,使用格式为
声明切片的方法
1.   数组[开始位置:结束位置]
2.   切片[开始位置:结束位置]
3.   var 切片变量名 []元素类型
4.   var 切片变量名 []元素类型 
	 切片变量名 = make([]元素类型,切片长度,切片容量)

从数组中生成切片
package main

import "fmt"

func main() {
	var arr = [...]string{"a", "b", "c", "d"} // 数组声明
	fmt.Println(arr)
	var arr_slice = arr[1:3]    // 数组的切片
	fmt.Println(arr_slice)      // 数组的切片
	fmt.Println(arr_slice[0])   // 切片的第0个元素
	fmt.Println(&arr_slice[0])  // 切片第0个元素的地址
	fmt.Println(len(arr_slice)) // 切片长度
	fmt.Println(cap(arr_slice)) // 切片容量
}
初始化切片

在声明切片的同时进行初始化赋值,这个步骤和数组一模一样,所以,切片和数组是相通的。

package main

import "fmt"

func main() {
	var arr_slice = []int{1, 2, 3, 4, 5}
	fmt.Println("切片: ", arr_slice)
	fmt.Println("切片长度: ", len(arr_slice))
	fmt.Println("切片容量: ", cap(arr_slice))
	fmt.Println("判断切片是否为空: ", arr_slice == nil)

}

// 切片:  [1 2 3 4 5]
// 切片长度:  5
// 切片容量:  5
// 判断切片是否为空:  false

直接声明切片并进行make初始化操作

本案例说明切片本身不具备数值,初始化之后也为0值,初始化确定的是切片的类型、切片的长度、切片的容量 。

package main

import "fmt"

func main() {
	var arr_slice []int
	arr_slice = make([]int, 2, 10)
	fmt.Println("切片: ", arr_slice)
	fmt.Println("切片长度: ", len(arr_slice))
	fmt.Println("切片容量: ", cap(arr_slice))
	fmt.Println("判断切片是否为空: ", arr_slice == nil)
}
// 切片:  [0 0]
// 切片长度:  2
// 切片容量:  10
// 判断切片是否为空:  false

写法2 :

package main

import (
	"fmt"
)

func main() {
	student := make([]int, 2, 5)
	fmt.Print(student)
}

为切片添加元素

我们可以使用append()函数来对切片进行元素的添加。
注意:当切片不能再容纳其他元素时(即当前切片长度值等于容量值),下一次使用append()函数对切片进行元素添加,容量会按2倍数进行扩充。
举例:

package main

import (
	"fmt"
)

func main() {
	student := make([]int, 1, 1)
	for i := 0; i < 8; i++ {
		student = append(student, i)
		fmt.Println("当前切片的长度为: ", len(student),
			"当前的容量为: ", cap(student), "当前的切片值为: ", student)
	}
}
// 当前切片的长度为:  2 当前的容量为:  2 当前的切片值为:  [0 0]
// 当前切片的长度为:  3 当前的容量为:  4 当前的切片值为:  [0 0 1]
// 当前切片的长度为:  4 当前的容量为:  4 当前的切片值为:  [0 0 1 2]
// 当前切片的长度为:  5 当前的容量为:  8 当前的切片值为:  [0 0 1 2 3]
// 当前切片的长度为:  6 当前的容量为:  8 当前的切片值为:  [0 0 1 2 3 4]
// 当前切片的长度为:  7 当前的容量为:  8 当前的切片值为:  [0 0 1 2 3 4 5]
// 当前切片的长度为:  8 当前的容量为:  8 当前的切片值为:  [0 0 1 2 3 4 5 6]
// 当前切片的长度为:  9 当前的容量为:  16 当前的切片值为:  [0 0 1 2 3 4 5 6 7]
对切片的操作也会影响产生它的数组随之进行变化

如果切片是从其他数组或切片生成,新切片的元素添加需要考虑对原有数组或切片中数据的影响。

package main

import "fmt"

func main() {
	var student = [...]string{"Tom", "Ben", "peter"}
	var student1 = student[0:1]
	fmt.Println("student数组: ", student)
	fmt.Println("student1切片: ", student1)
	student1 = append(student1, "Danny")
	fmt.Println("扩充Danny后的student1切片: ", student1,
		"  切片长度为: ", len(student1),
		"  切片容量为: ", cap(student1))
	fmt.Println("扩充Danny后的student数组: ", student)
}
// student数组:  [Tom Ben peter]
// student1切片:  [Tom]
// 扩充Danny后的student1切片:  [Tom Danny]   切片长度为:  2   切片容量为:  3
// 扩充Danny后的student数组:  [Tom Danny peter]
通过切片删除元素

需要我们手动将删除点前后的元素连接起来,从而实现对切片中元素的删除。

package main

import "fmt"

func main() {
	var student = []string{"Tom", "Ben", "DROP", "peter"}
	student = append(student[:2], student[3:]...)
	fmt.Println(student)
}
遍历切片

切片的遍历和数组类似,可以通过切片下标来进行遍历。切片下标同样从0开始,第一个元素的数组下标为0,第二个元素的数组下标为1,以此类推。

package main

import "fmt"

func main() {
	var student = []string{"Tom", "Ben", "DROP", "peter"}
	for k, v := range student {
		fmt.Println("k = ", k, " ", "v = ", v)
	}
}

总结
  • 切片表示多个同类型元素的连续集合,但是切片本身并不存储任何元素,而只是对现有数组的引用。

  • 如果切片是从其他数组或切片生成,新切片的元素添加需要考虑对原有数组或切片中数据的影响。

  • Go语言没有为删除切片元素提供方法,所以需要我们手动将删除点前后的元素连接起来,从而实现对切片中元素的删除。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/694029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号