首页 > 其他分享 >03.切片的概念

03.切片的概念

时间:2024-07-08 23:52:37浏览次数:19  
标签:03 slice fmt 切片 概念 数组 Println main

切片(Slice)是 Go 语言中非常重要的一种数据结构,用于处理具有动态长度的序列。切片是对数组的抽象,可以更灵活地操作和管理数组的数据。下面详细介绍切片的概念及其核心特点。

切片的基本概念

定义

切片是一个引用类型,它指向一个底层数组的一部分或全部。与数组不同,切片的长度可以动态变化。切片包含三个部分:指针、长度和容量。

  • 指针:指向切片对应的底层数组的起始位置。
  • 长度:切片中实际元素的数量,可以使用内置函数 len 获取。
  • 容量:从切片的起始位置到底层数组的末尾位置之间的元素数量,可以使用内置函数 cap 获取。

初始化

切片可以通过多种方式初始化:

  1. 字面量初始化:直接使用字面量创建切片。
  2. 内置函数 make:使用 make 函数创建指定长度和容量的切片。
  3. 从数组或其他切片创建:通过对数组或其他切片的切片操作来创建。

示例

package main

import "fmt"

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

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

    // 从数组创建切片
    arr := [5]int{10, 20, 30, 40, 50}
    slice3 := arr[1:4]
    fmt.Println("slice3:", slice3)

    // 从其他切片创建切片
    slice4 := slice1[2:]
    fmt.Println("slice4:", slice4)
}

 

切片的特点

  1. 动态长度:切片的长度可以动态变化,可以通过 append 函数向切片添加元素。

  2. 底层数组共享:多个切片可以共享同一个底层数组,对一个切片的修改可能影响其他切片。

  3. 值传递:切片本身是一个引用类型,但在传递时依然是值传递。即使传递的是引用,但底层数组仍然是共享的。

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

  5. 高效的内存管理:由于切片只是在底层数组上进行切片操作,因此创建切片非常高效,不会复制底层数组。

切片操作

动态增长

使用 append 函数可以向切片中添加元素。如果底层数组容量不足,append 会创建一个新的数组并将原有数据复制过去。

package main

import "fmt"

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

 

切片的切片

可以对一个切片再进行切片操作,新的切片仍然共享原始切片的底层数组。

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}
    subSlice := slice[1:4]
    fmt.Println("subSlice:", subSlice)
}

 

获取长度和容量

使用内置函数 len 获取切片的长度,使用 cap 获取切片的容量。

package main

import "fmt"

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

 

切片的应用场景

切片在 Go 语言中有广泛的应用场景,特别适合处理动态大小的数据集合,如:

  • 实现栈、队列等数据结构
  • 处理和操作字符串
  • 动态集合的处理,如读取文件行、网络数据包等

总结

切片是 Go 语言中用于处理动态长度序列的灵活且高效的数据结构。通过对切片的指针、长度和容量的管理,Go 提供了在不牺牲性能的前提下灵活处理数组数据的能力。了解和掌握切片的概念和使用方法对于编写高效和可维护的 Go 代码至关重要。

标签:03,slice,fmt,切片,概念,数组,Println,main
From: https://www.cnblogs.com/JJJHaoran/p/18290911

相关文章

  • [email protected](52)[email protected](1)- 核心概念
    目录1,MVC2,前端MVC的困难3,Flux4,Redux1,MVC是一个解决方案,用于降低UI和数据关联的复杂度。在早期前后端未做分离时,服务端会响应一个完整的HTML,包含页面需要的所有数据。而浏览器仅承担渲染页面的作用,整体流程也就是服务端渲染。其中服务端的处理流程:处理请求,并将......
  • 单片机知多少之STM32F103-GPIO输出应用篇
    示例:选择GPIOB做流水灯控制逻辑将8个发光二极管的负端分别接入PB0~PB7,正端接5V电源,当配置GPIO为低电平时,回路导通,二极管开始工作,亮灯;当配置GPIO为高电平时,回路等电位断开,二极管不工作,灭灯,使GPIO输出按一定顺序执行,即流水灯。编写代码变量定义:GPIO_InitTypeDefGPIO_InitSt......
  • 使用mybatis切片实现数据权限控制
     数据权限控制需要对查询出的数据进行筛选,对业务入侵最少的方式就是利用mybatis或者数据库连接池的切片对已有业务的sql进行修改。切片逻辑完成后,仅需要在业务中加入少量标记代码,就可以实现对数据权限的控制。这种修改方式,对老业务的逻辑没有入侵或只有少量入侵,基本不影响老业......
  • 数据库概念设计
    概念设计是数据库设计的核心环节。简单来说,就是通过用户需要,进行综合归纳与抽象,形成一个独立于DBMS的概念模型。数据库概念设计的目标:或者说定义和描述应用领域设计的数据范围。1.获取信息模型2.描述数据的属性特征3.描述数据之间的关系4.定义和描述数据之间的约束5.说......
  • SpringMVC-03-RestFul和Controller
    1、ControllerMVC架构中的控制层,在SpringMVC中,由Handler组成负责提供访问应用程序的行为:处理用户的请求并调用Model层将其转换为一个模型数据跳向View层在SpringMVC中,对于Controller的配置方式有很多种,通常可以通过接口定义或注解定义两种方法实现新建一个子项目,Sprin......
  • 02.Slice 切片
    切片(Slice)是Go语言中比数组更为灵活和强大的数据结构。切片本质上是对数组的一个视图,可以动态调整大小。下面详细介绍切片的定义、初始化、操作和使用注意事项。切片的定义与初始化切片的定义语法为:[]T,其中T表示切片元素的类型。切片的初始化可以通过数组字面量、内置函数m......
  • P10359 [PA2024] Kolorowy las
    MyBlogsP10359[PA2024]Kolorowylas/tuu。写了三天。首先考虑树的形态不变怎么做,直接的想法是树分治这种东西可以做到一只或者两只\(\log\)。但是点分这种东西不太好扩展到动态树的问题。但是因为这是单点查询,所以可以不用真正的树上染色,只需要回答每个询问即可。考虑对于......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)03——各类运算符、标识符关键字、进制转换、
    文章目录前言一、运算符(算术、关系、逻辑、赋值、三元)1.算术运算符2.关系运算符(比较运算符)3.逻辑运算符4.赋值运算符5.三元运算符TernaryOperator二、运算符优先级三、标识符规范与关键字1.标识符命名规则和规范2.关键字3.保留字四、键盘输入五、进制介绍转换,......
  • springboot事故车辆与违章车辆跟踪系统-计算机毕业设计源码03863
    摘  要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设事......
  • 【软件工程造价师必修课:概念篇】4.ILF/EIF/EI/EO/EQ/BFC五大功能点说的明明白白!附案例
       软件成本评估工作,本身有一定的专业性,也是有一定的门槛,最主要的难点在功能点识别方面。  下面我们就针对评估过程中需要掌握的功能点知识,分享给大家,大家先了解概念,继而通过我们的案例来让概念更具体化,从而达到初步了解并掌握。BFC 基本功能组件BasicFunction......