Go程序:演示数组切片用法

举报
howard2005 发表于 2021/12/30 00:30:46 2021/12/30
【摘要】 在Go语言中,数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求,但是Go语言提供了数组切片(slice)这个非常酷的功能来弥补数组的不足。初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是 个指针。数组切片的数据结构可以抽象为以下3个...
在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] = (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]

文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。

原文链接:howard2005.blog.csdn.net/article/details/79333142

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。