在Go语言中,数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是 个指针。数组切片的数据结构可以抽象为以下3个变量: 
  1. 一个指向原生数组的指针;
  2. 数组切片中的元素个数;
  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] = (+ 1) * (+ 1)
    }
    for i := 0; i < len(slice6); i++ {
        slice6[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: [-----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程序:演示数组切片用法相关推荐

  1. Python中数组切片的用法详解

    Python中数组切片的用法详解 一.python中"::-1"代表什么? 二.python中":"的用法 三.python中数组切片 三.numpy中的整数数 ...

  2. python数组切片教程_手把手numpy教程【二】——数组与切片

    今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算. 上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多.并且Numpy的AP ...

  3. VTK:演示回调的用法实战

    VTK:演示回调的用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkAxesActor.h> ...

  4. linux 关联数组,Linux shell数组与关联数组的用法实例

    Linux shell数组与关联数组的用法实例 1. 关联数组 使用 declare -A(declare 的用法请使用 help 进行查看,help declare) 进行声明关联数组变量: $ d ...

  5. python数组切片赋值_基于numpy中数组元素的切片复制方法

    代码1: #!/usr/bin/python import numpy as np arr1 = np.arange(10) print(arr1) slice_data = arr1[3:5] pr ...

  6. 微信小程序开发的基本用法

    微信小程序开发的基本用法 1.数组或对象的遍历 1.1.数组遍历 wx:for="{{数组或对象}}" wx:for-item="循环项的名称" wx:for- ...

  7. vector 数组的用法

    vector 数组的用法 标签(空格分隔): vector STL C++ ACM STL标准模板库提供三种类型的组件: 容器,迭代器和算法,他们都支持泛型程序设计标准: 容器主要分为两大类: 顺序容 ...

  8. m3u8云切片程序PHP视频切片转码系统易语言源码(支持添加视频水印)

    文章目录 前言 一.m3u8云切片程序PHP视频切片转码系统易语言源码(支持添加视频水印) 二.程序演示与下载 1.程序演示 2.程序下载 前言 这里就不过多赘述了,上篇文章对m3u8也做过介绍了,这 ...

  9. Numpy学习笔记三——数组切片、bool索引、掩码和花哨索引

    Numpy数组切片.bool索引.掩码和花哨索引 数组切片(slice) 数组切片的公式为 my_array[start: end: step, start: end: step] #示例1: imp ...

最新文章

  1. FFmpeg学习4:音频格式转换
  2. OGRE 2.1 Windows 编译
  3. C#使用log4net记录日志
  4. Android之linux基础教学之六 异常
  5. python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
  6. 还有多少人不会用K8s?.NET高级高薪岗,开始要求了!
  7. Yarn的三种资源调度机制
  8. 5个Python特性 越早知道越好的
  9. OpenSSL学习(十四):基础-指令passwd
  10. php数据库find(),db_find()
  11. signature=32c56289e10e63e51063305adfc34ef0,Deconfinement transition and Black Holes
  12. 【纸牌识别】基于matlab灰度二值化纸牌识别【含Matlab源码 464期】
  13. select 默认选中问题
  14. android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
  15. 微信小程序中的 tabBar
  16. Windows下智能卡开发
  17. Filebeat日志采集
  18. 从物联网到元宇宙-李正海在物联网大会上的发言
  19. setBounds(left, top, right, bottom)详解
  20. oracle 发的邮件qq,python基于SMTP发送QQ邮件

热门文章

  1. python方法的分类(实例方法、类方法、静态方法)
  2. 无线打印 airprint 服务器,Docker容器实现Airprint 打印服务器功能
  3. Python赋值语句浅析
  4. poj 1797 HeavyTransportation——最小边的最大值
  5. poj 2387 Til the Cows Come Home dijkstra
  6. python逐行读取与逐行写入txt文件
  7. 教师计算机提升学到的知识,教师计算机教学工作总结(精选6篇)
  8. mysql教程排序_MySQL中的排序函数field()实例详解
  9. oracle还原 ora 39111,在server2008上进行impdp引发的(ORA-39070)的问题
  10. 和平精英现在服务器暂时未开放,和平精英为什么登陆不进去 和平精英服务器分批登陆是什么意思...