在Go语言中,数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是 个指针。数组切片的数据结构可以抽象为以下3个变量:
- 一个指向原生数组的指针;
- 数组切片中的元素个数;
- 数组切片已分配的存储空间。
/*
* 功能:演示数组切片的用法
*/
package main
import (
"fmt"
)
func main() {
/* 基于数组创建数组切片 */
var arr = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var slice1 []int = arr[3:7] // 截取第4个到第7个元素
var slice2 []int = arr[:5] // 截取左边5个元素
var slice3 []int = arr[7:] // 从第8个元素开始截取
var slice4 []int = arr[:] // 全部数组元素
fmt.Println("array:", arr)
fmt.Println("slice1:", slice1)
fmt.Println("slice2:", slice2)
fmt.Println("slice3:", slice3)
fmt.Println("slice4:", slice4)
/* 直接创建数组切片 */
slice5 := make([]int, 5)
slice6 := make([]int, 5, 10)
slice7 := []int{1, 2, 3, 4, 5}
for i := 0; i < len(slice5); i++ {
slice5[i] = (i + 1) * (i + 1)
}
for i := 0; i < len(slice6); i++ {
slice6[i] = -(i + 1)
}
fmt.Println("slice5:", slice5)
fmt.Println("slice6:", slice6)
fmt.Println("slice7:", slice7)
/* 基于切片创建切片 */
slice8 := []int{45, 23, 67, 56, 43, 56, 50}
slice9 := slice8[:4] // 截取左边4个元素
slice10 := slice8[2:5] // 截取第3个到第5个元素
fmt.Println("slice8:", slice8)
fmt.Println("slice9:", slice9)
fmt.Println("slice10:", slice10)
/* 遍历数组切片 */
for i := 0; i < len(slice1); i++ {
fmt.Println("slice1[", i, "]=", slice1[i])
}
for i, v := range slice2 {
fmt.Println("slice2[", i, "]=", v)
}
/* 动态增加元素 */
slice := make([]int, 5, 10)
fmt.Println("len(slice)=", len(slice)) // 长度
fmt.Println("cap(slice)=", cap(slice)) // 容量
slice[0], slice[1], slice[2], slice[3], slice[4] = 100, 200, 300, 400, 500
slice = append(slice, 45, 23, 89) // 增加三个元素到slice
new_slice := []int{5, 7, 3} // 创建新数组切片new_slice
slice = append(slice, new_slice...) // 将新数组切片打散后添加到slice里(必须有...,表明打散)
fmt.Println("slice:", slice)
/* 内容复制 */
// 当源切片长度大于目标切片,目标切片内容全部被替换
source_slice := []int{23, 56, 56, 67, 31, 56}
target_slice := []int{46, 24, 33, 24}
fmt.Println("复制之前:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
copy(target_slice, source_slice) // 第一个参数是目标切片,第二个参数是源切片
fmt.Println("复制之后:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
// 当源切片长度小于目标切片,目标切片内容部分被替换
source_slice = []int{23, 56, 56, 67}
target_slice = []int{46, 24, 33, 24, 34, 67}
fmt.Println("复制之前:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
copy(target_slice, source_slice) // 第一个参数是目标切片,第二个参数是源切片
fmt.Println("复制之后:")
fmt.Println("source_slice:", source_slice)
fmt.Println("target_slice:", target_slice)
}
运行结果:
array: [1 2 3 4 5 6 7 8 9 10]
slice1: [4 5 6 7]
slice2: [1 2 3 4 5]
slice3: [8 9 10]
slice4: [1 2 3 4 5 6 7 8 9 10]
slice5: [1 4 9 16 25]
slice6: [-1 -2 -3 -4 -5]
slice7: [1 2 3 4 5]
slice8: [45 23 67 56 43 56 50]
slice9: [45 23 67 56]
slice10: [67 56 43]
slice1[ 0 ]= 4
slice1[ 1 ]= 5
slice1[ 2 ]= 6
slice1[ 3 ]= 7
slice2[ 0 ]= 1
slice2[ 1 ]= 2
slice2[ 2 ]= 3
slice2[ 3 ]= 4
slice2[ 4 ]= 5
len(slice)= 5
cap(slice)= 10
slice: [100 200 300 400 500 45 23 89 5 7 3]
复制之前:
source_slice: [23 56 56 67 31 56]
target_slice: [46 24 33 24]
复制之后:
source_slice: [23 56 56 67 31 56]
target_slice: [23 56 56 67]
复制之前:
source_slice: [23 56 56 67]
target_slice: [46 24 33 24 34 67]
复制之后:
source_slice: [23 56 56 67]
target_slice: [23 56 56 67 34 67]
Go程序:演示数组切片用法相关推荐
- Python中数组切片的用法详解
Python中数组切片的用法详解 一.python中"::-1"代表什么? 二.python中":"的用法 三.python中数组切片 三.numpy中的整数数 ...
- python数组切片教程_手把手numpy教程【二】——数组与切片
今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算. 上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多.并且Numpy的AP ...
- VTK:演示回调的用法实战
VTK:演示回调的用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkAxesActor.h> ...
- linux 关联数组,Linux shell数组与关联数组的用法实例
Linux shell数组与关联数组的用法实例 1. 关联数组 使用 declare -A(declare 的用法请使用 help 进行查看,help declare) 进行声明关联数组变量: $ d ...
- python数组切片赋值_基于numpy中数组元素的切片复制方法
代码1: #!/usr/bin/python import numpy as np arr1 = np.arange(10) print(arr1) slice_data = arr1[3:5] pr ...
- 微信小程序开发的基本用法
微信小程序开发的基本用法 1.数组或对象的遍历 1.1.数组遍历 wx:for="{{数组或对象}}" wx:for-item="循环项的名称" wx:for- ...
- vector 数组的用法
vector 数组的用法 标签(空格分隔): vector STL C++ ACM STL标准模板库提供三种类型的组件: 容器,迭代器和算法,他们都支持泛型程序设计标准: 容器主要分为两大类: 顺序容 ...
- m3u8云切片程序PHP视频切片转码系统易语言源码(支持添加视频水印)
文章目录 前言 一.m3u8云切片程序PHP视频切片转码系统易语言源码(支持添加视频水印) 二.程序演示与下载 1.程序演示 2.程序下载 前言 这里就不过多赘述了,上篇文章对m3u8也做过介绍了,这 ...
- Numpy学习笔记三——数组切片、bool索引、掩码和花哨索引
Numpy数组切片.bool索引.掩码和花哨索引 数组切片(slice) 数组切片的公式为 my_array[start: end: step, start: end: step] #示例1: imp ...
最新文章
- FFmpeg学习4:音频格式转换
- OGRE 2.1 Windows 编译
- C#使用log4net记录日志
- Android之linux基础教学之六 异常
- python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
- 还有多少人不会用K8s?.NET高级高薪岗,开始要求了!
- Yarn的三种资源调度机制
- 5个Python特性 越早知道越好的
- OpenSSL学习(十四):基础-指令passwd
- php数据库find(),db_find()
- signature=32c56289e10e63e51063305adfc34ef0,Deconfinement transition and Black Holes
- 【纸牌识别】基于matlab灰度二值化纸牌识别【含Matlab源码 464期】
- select 默认选中问题
- android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
- 微信小程序中的 tabBar
- Windows下智能卡开发
- Filebeat日志采集
- 从物联网到元宇宙-李正海在物联网大会上的发言
- setBounds(left, top, right, bottom)详解
- oracle 发的邮件qq,python基于SMTP发送QQ邮件
热门文章
- python方法的分类(实例方法、类方法、静态方法)
- 无线打印 airprint 服务器,Docker容器实现Airprint 打印服务器功能
- Python赋值语句浅析
- poj 1797 HeavyTransportation——最小边的最大值
- poj 2387 Til the Cows Come Home dijkstra
- python逐行读取与逐行写入txt文件
- 教师计算机提升学到的知识,教师计算机教学工作总结(精选6篇)
- mysql教程排序_MySQL中的排序函数field()实例详解
- oracle还原 ora 39111,在server2008上进行impdp引发的(ORA-39070)的问题
- 和平精英现在服务器暂时未开放,和平精英为什么登陆不进去 和平精英服务器分批登陆是什么意思...