首页 > 其他分享 >02.Slice 切片

02.Slice 切片

时间:2024-07-08 17:09:36浏览次数:14  
标签:02 Slice int fmt 切片 slice Println main

切片(Slice)是 Go 语言中比数组更为灵活和强大的数据结构。切片本质上是对数组的一个视图,可以动态调整大小。下面详细介绍切片的定义、初始化、操作和使用注意事项。

切片的定义与初始化

切片的定义语法为:[]T,其中 T 表示切片元素的类型。切片的初始化可以通过数组字面量、内置函数 make 或从现有数组或切片中创建。

示例

package main

import "fmt"

func main() {
    // 使用数组字面量初始化切片
    slice1 := []int{1, 2, 3, 4, 5}
    fmt.Println(slice1) // 输出:[1 2 3 4 5]

    // 使用内置函数 make 初始化切片
    slice2 := make([]int, 5)
    fmt.Println(slice2) // 输出:[0 0 0 0 0]

    // 从现有数组或切片中创建切片
    arr := [5]int{10, 20, 30, 40, 50}
    slice3 := arr[1:4] // 包含索引 1 到 3 的元素,不包括 4
    fmt.Println(slice3) // 输出:[20 30 40]
}

切片的基本操作

访问与修改元素

切片的元素访问和修改与数组类似,通过索引进行。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}
    fmt.Println(slice[0]) // 输出:1

    slice[1] = 20
    fmt.Println(slice) // 输出:[1 20 3 4 5]
}

 

获取切片长度和容量

切片的长度通过 len 函数获取,容量通过 cap 函数获取。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}
    fmt.Println("Length:", len(slice)) // 输出:Length: 5
    fmt.Println("Capacity:", cap(slice)) // 输出:Capacity: 5
}

 

切片的动态增长

切片的长度可以通过内置函数 append 动态增加。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3}
    slice = append(slice, 4, 5)
    fmt.Println(slice) // 输出:[1 2 3 4 5]
}

 

切片的遍历

使用 for 循环或 range 关键字遍历切片。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}

    // 使用传统的 for 循环遍历切片
    for i := 0; i < len(slice); i++ {
        fmt.Println(slice[i])
    }

    // 使用 range 关键字遍历切片
    for index, value := range slice {
        fmt.Printf("Index: %d, Value: %d\n", index, value)
    }
}

 

多维切片

Go 语言支持多维切片。

package main

import "fmt"

func main() {
    // 定义一个二维切片
    var matrix [][]int

    // 初始化二维切片
    matrix = [][]int{
        {1, 2, 3},
        {4, 5, 6},
    }
    
    fmt.Println(matrix) // 输出:[[1 2 3] [4 5 6]]

    // 访问二维切片元素
    fmt.Println(matrix[0][1]) // 输出:2

    // 遍历二维切片
    for i := 0; i < len(matrix); i++ {
        for j := 0; j < len(matrix[i]); j++ {
            fmt.Printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j])
        }
    }
}

 

使用切片应注意的点

  1. 切片的零值:切片的零值是 nil,一个 nil 切片的长度和容量都是 0。

    var slice []int
    fmt.Println(slice == nil) // 输出:true
    fmt.Println(len(slice)) // 输出:0
    fmt.Println(cap(slice)) // 输出:0
  2. 共享底层数组:切片是对底层数组的引用,多个切片可以共享同一个底层数组。对一个切片的修改可能影响共享相同底层数组的其他切片。

    arr := [5]int{1, 2, 3, 4, 5}
    slice1 := arr[:]
    slice2 := arr[2:]
    slice2[0] = 100
    fmt.Println(slice1) // 输出:[1 2 100 4 5]
    fmt.Println(slice2) // 输出:[100 4 5]
  3. 使用 append 时的容量增长:如果切片的容量不足以容纳新的元素,append 操作会创建一个新的底层数组,将旧数组的内容复制过去。

    slice := []int{1, 2, 3}
    fmt.Printf("Before append: len = %d, cap = %d\n", len(slice), cap(slice))
    slice = append(slice, 4, 5)
    fmt.Printf("After append: len = %d, cap = %d\n", len(slice), cap(slice))

切片的切片:可以对切片再进行切片操作,但新切片仍然引用相同的底层数组。

slice := []int{1, 2, 3, 4, 5}
subSlice := slice[1:4]
fmt.Println(subSlice) // 输出:[2 3 4]

切片(Slice)是 Go 语言中比数组更为灵活和强大的数据结构。切片本质上是对数组的一个视图,可以动态调整大小。下面详细介绍切片的定义、初始化、操作和使用注意事项。

综合示例

下面的代码展示了切片的各种操作,包括定义、初始化、访问、修改、遍历、动态增长和多维切片的使用。

package main

import "fmt"

func main() {
    // 定义和初始化切片
    slice := []int{1, 2, 3, 4, 5}
    fmt.Println("Initial slice:", slice)

    // 访问和修改元素
    slice[2] = 100
    fmt.Println("Modified slice:", slice)

    // 获取切片长度和容量
    fmt.Println("Length:", len(slice))
    fmt.Println("Capacity:", cap(slice))

    // 动态增长切片
    slice = append(slice, 6, 7)
    fmt.Println("Appended slice:", slice)

    // 遍历切片
    fmt.Println("Slice elements:")
    for i, v := range slice {
        fmt.Printf("Index: %d, Value: %d\n", i, v)
    }

    // 多维切片
    matrix := [][]int{
        {1, 2, 3},
        {4, 5, 6},
    }
    fmt.Println("2D Slice:", matrix)
    
    // 遍历多维切片
    for i := 0; i < len(matrix); i++ {
        for j := 0; j < len(matrix[i]); j++ {
            fmt.Printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j])
        }
    }
}

标签:02,Slice,int,fmt,切片,slice,Println,main
From: https://www.cnblogs.com/JJJHaoran/p/18290336

相关文章

  • P10359 [PA2024] Kolorowy las
    MyBlogsP10359[PA2024]Kolorowylas/tuu。写了三天。首先考虑树的形态不变怎么做,直接的想法是树分治这种东西可以做到一只或者两只\(\log\)。但是点分这种东西不太好扩展到动态树的问题。但是因为这是单点查询,所以可以不用真正的树上染色,只需要回答每个询问即可。考虑对于......
  • 2024春秋杯 stdout
    考点:文件,setvbuf缓冲区,ret2syscall,ret2csu题目给了libc文件。main函数和vlun函数存在明显的栈溢出int__cdeclmain(intargc,constchar**argv,constchar**envp){charbuf[80];//[rsp+0h][rbp-50h]BYREFinit(argc,argv,envp);puts("whereismystdout?......
  • SMU Summer 2024 Contest Round 1(7.8)
    A_DiceandCoin题目链接:abc126_c思路:分别求所有掷到的筛子数时赢得可能,进行求和voidsolve(){intn,k;cin>>n>>k;doubleans=0;for(inti=1;i<=n;++i){doublenow=1.0/n;if(i>=k)ans+=now;else{......
  • 2024最火的AI绘画软件——Stable Diffusion整合包安装教程,奶奶看了都会!
    2024年绘画圈最火的软件,那妥妥的就StableDiffutionV4升级版无需安装,直接解压就能用(在此要感谢秋葉aaaki大佬的分享!)比之前版本的更加智能、高效和易操作。V4加强版小白也能轻易上手!「无套路!添加下方即可领取」1.软件背景信息▍StableDiffusion是什么?StableDif......
  • SMU Summer 2024 Contest Round 1
    SMUSummer2024ContestRound1DiceandCoin题意给个n面骰子和一枚硬币,初始投骰子,若骰子的值在1到\(K-1\)之间则反复投硬币,硬币为正则该值翻倍,否则为0,当值为0输掉游戏或者大于等于\(K\)时赢得游戏结束,问你可以赢得游戏的概率为多少。思路以1到n为初始值......
  • 【0295】Posgres内核 dynahash table 之 hash_search 实现原理(2)
    相关文章:【0294】Postgres内核dynahash之hash_search实现原理(1)0.前言在【0294】Postgres内核dynahash之hash_search实现原理(1)一文中,从Postgres内核源码角度详细讲解了dynamichashtable中hashsearch的实现原理。具体内容:如何确定segment位置如何确定bu......
  • 2024华为与IPD融合的质量研发体系设计,附设计案例
    (一)与IPD融合的治理研发体系设计大纲1.0IPD基础1.1IPD主业务流框架IPD(IntegratedProductDevelopment)是一种集成产品开发的方法,旨在通过跨部门协作和资源整合,提高产品开发效率和质量。其主业务流框架包括需求管理、产品规划、技术开发、产品验证和市场发布等关键环节.1.2......
  • 2024年文化研究与数字媒体国际会议 (CRDM 2024)
    2024年文化研究与数字媒体国际会议(CRDM2024)2024InternationalConferenceonCulturalResearchandDigitalMedia【重要信息】大会地点:珠海大会官网:http://www.iccrdm.com投稿邮箱:[email protected]【注意:稿将稿件Word+PDF上传至邮箱,邮件正文请备注“CRDM 2024......
  • 20240706总结(线段树应用)
    A-PhysicalEducationLessonsCF915EPhysicalEducationLessons题解:没什么好说的,动态开点模板题(好像普通线段树也可以做)B-GCDofanArrayCF1493DGCDofanArray题解:暴力分解质因数,修改的时候也把x分解,对每个质数开一个可重集合(multiset)记录一下每个质数出现的不同位......
  • 应用程序无法正常启动(0xc0150002)的解决思路
    背景介绍一测试朋友,因为重装了操作系统,然后之前的工具突然无法使用了。现象现象1现象2解决现象1很显然,缺少运行库。你如果安装了visualstudio,那么其安装目录下xxx\MicrosoftVisualStudio\2019\Professional\VC\Redist\MSVC会存在需要的运行库或者是运行库安装......