Go基础知识:切片

news2024/11/24 13:49:26

数组

Go 数组的大小是固定的,其长度是其类型的一部分([4]int并且[5]int是不同的、不兼容的类型)

var a [10]int

b := [2]string{"Penn", "Teller"}
b := [...]string{"Penn", "Teller"}

package main

import "fmt"

func main() {
	var a [2]string
	a[0] = "Hello"
	a[1] = "World"
	fmt.Println(a[0], a[1])
	fmt.Println(a)

	primes := [6]int{2, 3, 5, 7, 11, 13}
	fmt.Println(primes)
}

Go的数组表示值,数组变量表示整个数组;它不是指向第一个数组元素的指针(在 C 中是这种情况)。这意味着当您分配或传递数组值时,您将复制其内容。(为了避免复制,您可以将指针传递给数组,但那是指向数组的指针,而不是数组。)


package main

import "fmt"

// 函数接收数组指针作为参数。
// 如果不用指针,接收到的将是arr的副本,在函数内部修改不会影响到原数组。
func modifyArrayPointer(arr *[5]int) {
	arr[0] = 100                                    // 修改数组的第一个元素
	fmt.Println("Inside modifyArrayPointer:", *arr) // 打印修改后的数组
}

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	fmt.Println("修改前:", arr)

	modifyArrayPointer(&arr) // 传递数组的指针

	fmt.Println("修改后:", arr) // 原数组被改变
}


切片

切片类型是基于Go数组类型之上的抽象,提供了更强大的功能和便利性。
数组大小固定,而切片则为数组元素提供了动态大小、灵活的视角。在实践中,切片比数组更常用。
切片是数组段的描述符。由指向数组的指针、段的长度及其容量(段的最大长度)组成。

[]T 表示一个元素类型为T的切片。

切片通过两个下标界定,左闭右开

a[low : high]

如下表示,包含下标从1到3的元素

a[1:4]

package main

import "fmt"

func main() {
	primes := [6]int{2, 3, 5, 7, 11, 13}

	var s []int = primes[1:4]
	fmt.Println(s)
}

在这里插入图片描述
s := make([]byte, 5) 结构如下

在这里插入图片描述

s = s[2:4]
在这里插入图片描述

切片类似数组引用

切片就像数组的引用 切片并不存储任何数据,它只是描述了底层数组中的一段。

更改切片的元素会修改其底层数组中对应的元素。
它共享底层数组的切片都会观测到这些修改。

使用字面量或make创建切片时,会创建一个新的底层数组。
使用数组或切片重新切片时,不会创建新的数组,而是引用已有的底层数组。

package main

import "fmt"

func main() {
	names := [4]string{
		"John",
		"Paul",
		"George",
		"Ringo",
	}
	fmt.Println(names)

	a := names[0:2]
	b := names[1:3]
	fmt.Println(a, b)

	b[0] = "XXX"
	fmt.Println(a, b)
	fmt.Println(names)
}

切片字面量(Slice literals)

切片字面量类似于没有长度的数组字面量。

// 这是一个数组字面量:
[3]bool{true, true, false}

//下面这样则会创建一个和上面相同的数组,然后再构建一个引用了它的切片:
[]bool{true, true, false}

切片默认行为

在进行切片时,你可以利用它的默认行为来忽略上下界。
切片下界的默认值为 0,上界则是该切片的长度。
对于数组

var a [10]int

来说,以下切片表达式和它是等价的

a[0:10]
a[:10]
a[0:]
a[:]

给定数组创建切片

x := [3]string{"Лайка", "Белка", "Стрелка"}
s := x[:] // a slice referencing the storage of x

切片长度与容量

切片的长度就是它所包含的元素个数。
切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。

  • len(s) 切片长度
  • cap(s) 切片容量

切片的零值是nil。nil切片的长度和容量为0,且没有底层数组。

使用make创建切片

a := make([]int, 5)  // len(a)=5

b := make([]int, 0, 5) // len(b)=0, cap(b)=5

b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1:]      // len(b)=4, cap(b)=4

使用append向切片追加元素

func append(s []T, vs ...T) []T

append 的第一个参数 s 是一个元素类型为 T 的切片,其余类型为 T 的值将会追加到该切片的末尾。
append 的结果是一个包含原切片所有元素加上新添加元素的切片。

当 s 的底层数组太小,不足以容纳所有给定的值时,它就会分配一个更大的数组。 返回的切片会指向这个新分配的数组。

package main

import "fmt"

func main() {
	var s []int
	printSlice(s)

	// 可在空切片上追加
	s = append(s, 0)
	printSlice(s)

	// 这个切片会按需增长
	s = append(s, 1)
	printSlice(s)

	// 可以一次性添加多个元素
	s = append(s, 2, 3, 4)
	printSlice(s)
}

func printSlice(s []int) {
	fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

使用range遍历切片

当使用 for 循环遍历切片时,每次迭代都会返回两个值。 第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
	for i, v := range pow {
		fmt.Printf("2**%d = %d\n", i, v)
	}
}

来源

https://tour.go-zh.org/
https://go.dev/tour/welcome/1
https://go.dev/blog/slices-intro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机专业大一课程:线性代数探秘

计算机专业大一课程:线性代数探秘 对于计算机专业的大一新生来说,线性代数是一门基础且重要的课程。它不仅是数学的一个分支,更是计算机科学中不可或缺的工具。那么,线性代数究竟包含哪些内容,对我们的计算机学习有何…

操作系统(1) (进程属性/内存映像/进程状态/PCB/上下文切换)

目录 1. 进程及其实现 2. 没有进程概念之前的系统 3. 进程的属性 4. 进程的内存映像 5. 进程状态及其转换 6. 进程描述与操作控制结构 操作控制结构: 操作系统使用数据结构来记录进程和系统资源的状态: 进程控制块(PCB)&a…

libmodbus编程应用(超详细源码讲解)

目录 前言 libmodbus开发库 1.功能概要 2.源码获取 3.libmodbus与应用程序的关系 libmodbus源代码解析 1.核心函数 2.框架分析与数据结构 3.情景分析 (1)初始化 (2)主设备发送请求 (3)主/从设备…

【Adobe PR】Adobe Premiere Pro 快捷键介绍

Adobe Premiere Pro (简称PR) 是一款广泛使用的视频编辑软件,熟练掌握其快捷键可以显著提高编辑效率。下面是整理的一些常用的Adobe Premiere Pro快捷键,适用于Windows和Mac操作系统。对于Mac用户,除非特别指出,通常可以将Ctrl键替…

视频画面变糊是平台在做手脚吗?

人气视频博主“影视飓风”一条新发布的视频被全网下架,这两日更是引起轩然大波,不仅频上热门,甚至还有不少数码与视频同行为其抱不平。那么影视飓风到底发布了一条什么视频?又为何会惨被全网下架呢? 10月8日&#xff0…

Android Studio Ladybug使用经典主题UI

背景 Android Studio Ladybug | 2024.2.1 默认使用new ui,但是已经找不到之前经典主题了。 通过插件方式设置经典主题 打开设置。Plugins。 在Marketplace中搜索:Classic UI 下面的截图是我已经安装完成的。 插件安装完成了,重启as即可。…

闭着眼学机器学习——K近邻分类

引言: 在正文开始之前,首先给大家介绍一个不错的人工智能学习教程:https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程,感兴趣的读者可以自行查阅。 1. 算法介绍 K近邻(K-Nearest Neighbors, KNN…

ScriptableObject基本使用

使用方法 自定义类继承ScriptableObject 可以在类内部增加数据或者数据类,一般用于配置 注意事项 给继承ScriptableObject的类增加CreateAssetMenu特性。 CreateAssetMenu一般默认三个参数 第一个参数是父目录 第二个参数是父目录的子选项 第三个参数是可以…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

FileZilla的简单使用

FileZilla的下载与安装以及简单使用(有图解超简单)-CSDN博客 参考这篇文章。 我在Window下安装了客户端,在虚拟机下启动Ubuntu,启用了Ubuntu的FTP服务。 按照该文章的流程进行下去,成功的把客户端上的文件上传到了F…

STM32学习--6-1 定时器定时中断

定时器电路图 第一步:RCC开启时钟,基本上每个代码都是第一步 第二步:选择时基单元的时钟源(内部时钟) 第三步:配置时基单元,包括预分频器、自动重装器、计数模式等,通过结构体配置…

Dockerfile(Jenkins)

1.创建⼀个jenkins的Dockerfile mkdir tomcat cd tomcat 2、上传需要的安装包 apache-tomcat-8.5.47.tar.gz jdk-8u211-linux-x64.tar.gz jenkins.war 3、编写Dockerfile vim Dockerfile # This my first jenkins Dockerfile # Version 1.0 FROM centos:7 MAINTAINER l…

Echarts+vue3+高德渲染地图

Echartsvue3高德渲染地图 一&#xff1a;安装 npm install echarts二&#xff1a;渲染地图 1. html <template><div class"content"><div ref"myChartsRef" id"map" style"width: 100%;height: 560px;" ></d…

JAVA自动化测试TestNG框架

1.TestNG简介 JAVA自动化测试最重要的基石。官网&#xff1a;https://testng.org 使用注解来管理我们的测试用例。 发现测试用例 执行测试用例 判断测试用例 生成测试报告 2.创建Maven工程 2.1创建一个maven工程 2.2设置maven信息 2.3设置JDK信息 2.4引入testng依赖 <dep…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

达梦数据库性能优化

1、SQL执行计划 拿到一条SQL的时候&#xff0c;首先要下达梦手册中提出的有效SQL规范&#xff0c;及是否命中了特殊OR子句的不规范&#xff0c;是否用了复杂的正则表达式&#xff0c;避免重复很高的索引&#xff0c;UINON ALL 是否可以替换UNION操作等,某些场景INSTR函数导致的…

FunASR离线文件转写服务开发指南-debian-10.13

FunASR离线文件转写服务开发指南-debian-10.13 服务器环境 debian10.13 64位 第一步 配置静态网卡 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4/etc/init.d/networking restart第…

C++面试速通宝典——25

473. HTTP如何减少重定向请求 重定向请求&#xff1a; ‌‌‌‌  服务器上的一个资源可能由于迁移、维护等原因从url1移至url2后&#xff0c;而客户端不知情&#xff0c;他还是继续请求url1&#xff0c;这时服务器不能粗暴地返回错误&#xff0c;而是通过302响应码和Locati…

甲方安全和乙方安全的区别

信息安全工作&#xff0c;总会被人分成甲方和乙方&#xff0c;甲乙方原本只是商务层面需方和供方的代称&#xff0c;在安全领域&#xff0c;成了做公司内部安全和为客户提供安全的区别。 通常意义上&#xff0c;什么是甲方安全人员呢&#xff1f;就是在非安全业务的公司从事信…

ROS2 通信三大件之动作 -- Action

通信最后一个&#xff0c;也是不太容易理解的方式action&#xff0c;复杂且重要 1、创建action数据结构 创建工作空间和模块就不多说了 在模块 src/action_moudle/action/Counter.action 下创建文件 Counter.action int32 target # Goal: 目标 --- int32 current_value…