1.5 Go切片使用

ops/2025/2/7 18:30:55/

一、切片简介

切片是相同类型元素的可变长度的集合,通常表示[]type。同一个切片中的元素类型都是一个类型的。它看上去跟数组一样,但是没有长度

二、切片的组成

每一个切片由三个部分组成

  • 底层数组的指针:指向切片实际存储数据的底层数组的某个位置,切片只是对底层数组的一个视图,不直接包含数据。
  • 长度(len):切片中当前包含的元素个数,也就是切片的有效部分的大小。
  • 容量(cap):切片从当前第一个元素到底层数组的末尾可以容纳的最大元素个数,它决定了切片在扩展时是否需要分配新的底层数组。

三、创建切片

1、基于数组创建切片

package mainimport "fmt"var sl1 = [6]string{"北京", "上海", "深圳", "广州", "杭州", "重庆"}func main() {// sl1 = [5]string{"北京", "上海", "深圳", "广州", "杭州"}fmt.Println(sl1[5])
}

2、直接创建

package mainimport "fmt"var sl1 = []string{"北京", "上海", "深圳", "广州", "杭州", "重庆"} //直接创建切片
func main() {fmt.Println(sl1[5])
}

3、使用内建make函数创建切片

package mainimport "fmt"func main() {// 创建一个长度为 6,容量为 6 的切片city1 := make([]string, 6)  // city1 的长度是 6,容量是 6fmt.Println("city1:", city1) // city1: ["" "" "" "" "" ""]fmt.Println("len(city1):", len(city1))  // 6fmt.Println("cap(city1):", cap(city1))  // 6// 创建一个长度为 6,容量为 8 的切片city2 := make([]string, 6, 8)  // city2 的长度是 6,容量是 8fmt.Println("city2:", city2) // city2: ["" "" "" "" "" ""]fmt.Println("len(city2):", len(city2))  // 6fmt.Println("cap(city2):", cap(city2))  // 8
}

四、切片长度和容量

package mainimport "fmt"var sl1 = []string{"北京", "上海", "深圳", "广州", "杭州", "重庆"} // 直接创建一个切片func main() {// city3 := sl1[1:4] // 创建一个从 sl1 切片中提取的子切片fmt.Println(city3) // 打印 city3fmt.Println(len(city3)) // 打印 city3 的长度fmt.Println(cap(city3)) // 打印 city3 的容量
}

切片类型的默认初始化值是 nil,此时切片没有关联任何底层数组,且其长度和容量均为 0。因此,切片只能与 nil 进行比较。如果需要检查切片是否为空,可以通过 len() == 0 来判断。

sl1 切片的初始化:sl1 是一个包含 6 个元素的切片,具体内容是:"北京", "上海", "深圳", "广州", "杭州", "重庆"。

切片操作:sl1[1:4]

从 sl1 切片中获取一个新的子切片 city3。切片操作的语法是 sl1[start:end],表示取 sl1 中从 start 索引到 end-1 索引的元素。注意这里的 end 是不包括的,所以实际上取的是 sl1[1] 到 sl1[3] 的元素

city3 := []string{"上海", "深圳", "广州"}

len() 和 cap()解释

  • len(city3):len() 返回的是切片中元素的数量,也就是切片的长度。由于 city3 包含 "上海", "深圳", "广州" 三个元素,len(city3) 返回的是 3。
  • cap(city3):cap() 返回的是切片的容量,即切片在不重新分配底层数组的情况下能够容纳的最大元素个数。对于 city3 来说,它是从 sl1[1:4] 提取的,因此底层数组仍然是 sl1 所引用的那个数组。所以 city3 的容量是从 sl1[1] 到 sl1 的末尾(即 sl1[5])的长度,这个长度是 5。也就是说,虽然 city3 的长度是 3,但是它可以继续扩展到 sl1 的末尾,总共可以容纳 5 个元素。因此,cap(city3) 返回的是 5。

打印结果

[上海 深圳 广州]

长度是4减去1==3,容量是多少?

容量解释:

  • city3 的长度 (len(city3)) 是 3,因为它包含了 3 个元素:“上海”, “深圳”, “广州”。
  • city3 的容量 (cap(city3)) 是 5,因为它是从 sl1[1:4] 切割出来的,而 sl1 的长度是 6,所以 city3 还有 3 个元素的扩展空间(从 sl1[4] 到 sl1[5])。

总结要点

  • 切片的 长度 是当前切片所包含的元素数量。
  • 切片的 容量 是切片在不重新分配底层数组的情况下可以容纳的最大元素数量。
  • 如果切片是从另一个切片中切割出来的,那么它的底层数组与原切片共享,因此它的容量会基于原切片的容量来决定。


http://www.ppmy.cn/ops/156504.html

相关文章

Android_P_Audio_系统(1) — Auido 系统简介

1 音频基础 1.1 声音的三要素 1. 音量(Volume) 也叫做响度(Loudness),人耳对声音强弱的主观感觉就是响度,响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大。当我们用较大的…

UE5 创建自定义工具上下文的方法

自定义工具管理类上下文 工具管理类:MyToolsManager,管理类依赖类:ContextQueriesAPI、ContextTransactionsAPI // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.…

Spring Boot 实例解析:从概念到代码

SpringBoot 简介: 简化 Spring 应用开发的一个框架整合 Spring 技术栈的一个大整合J2EE 开发的一站式解决方案优点:快速创建独立运行的 Spring 项目以及与主流框架集成使用嵌入式的 Servlet 容器,应用无需打成 war 包,内嵌 Tomcat…

DeepSeek横空出世,AI格局或将改写?

引言 这几天,国产AI大模型DeepSeek R1,一飞冲天,在全球AI圈持续引爆热度,DeepSeek R1 已经是世界上最先进的 AI 模型之一,可与 OpenAI 的新 o1 和 Meta 的 Llama AI 模型相媲美。 DeepSeek-V3模型发布后,在…

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

【再谈设计模式】命令模式~封装请求的指挥者

一、引言 在软件工程,软件开发过程中,高效的设计模式是构建灵活、可维护和可扩展系统的关键。命令模式作为一种行为型设计模式,为处理各种操作请求提供了一种巧妙的解决方案。它像是一个指挥中心,有条不紊地协调请求的发送者和执行…

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网(IoT)‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术,实时采集并连接任何需要监控、连接、互动的物体或过程,实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…