go 数组(array)和切片(slice)

news2024/11/15 23:50:13

文章目录

  • 数组Array
  • Slice 切片
    • append
    • copy(切片复制)
  • goto

数组Array

和以往的数组有很大的不同

  • 数组时值类型,复制和传参会复制整个数组,而不是指针
  • 数组长度必须是常量,且是类型的组成部分。[2]int[3]int是不同的数据类型
  • 支持 == 和 != 操作符
  • 指针数组[n]*T 数组指针 *[n]T
  • 可用符合语句初始化。
package main  
  
import "fmt"  
  
func main() {  
   a := [3]int{1, 2}           // 未初始化元素值为 0。  
   b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度。  
   c := [5]int{2: 100, 4: 200} // 使用索引号初始化元素。  
   //复合语句初始化  
   d := [...]struct {  
      name string  
      age  uint8  
   }{  
      {"user1", 10}, // 可省略元素类型。  
      {"user2", 20}, // 别忘了最后一行的逗号。  
   }  
   fmt.Println(a)  
   fmt.Println(b)  
   fmt.Println(c)  
   fmt.Println(d)  
   }

输出:

[1 2 0]
[1 2 3 4]              
[0 0 100 0 200]        
[{user1 10} {user2 20}]

多维数组:

package main  
  
import "fmt"  
  
func main() {  
   a := [2][3]int{{1, 2, 3}, {4, 5, 6}}  
   b := [...][2]int{{1, 1}, {2, 2}, {3, 3}}  
   fmt.Println(a)  
   fmt.Println(b)  
}

输出:

[[1 2 3] [4 5 6]]
[[1 1] [2 2] [3 3]]

Slice 切片

slice不是数组或者数组指针,他是通过内部指针和相关属性引用数组片段,以实现变长方案的
(理解成一个变长数组)

他是一个引用类型

package main  
  
import "fmt"  
  
func main() {  
   data := []int{1, 2, 3, 4, 5, 6, 7, 8}  
   slice := data[1:4:8]  // [low : high : max]
   fmt.Println(slice)  
   fmt.Println(len(slice))  
   fmt.Println(cap(slice))  
}

输出:

[2 3 4]
3
7

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xOMTFk2z-1673265973748)(../images/Pasted%20image%2020230109162238.png)]

len计算的是可用元素的数量,cap是计算最大的容量

三个值的灵活应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1b1SElD-1673265973749)(../images/Pasted%20image%2020230109162458.png)]

读写操作:

package main  
  
import "fmt"  
  
func main() {  
   data := [...]int{1, 2, 3, 4, 5, 6, 7, 8}  
  
   s := data[2:4] //【3,4】  
   s[0] += 100  
   s[1] += 200  
   fmt.Println(s)  
   fmt.Println(data)  
}

可以知道读写操作实际是底层的数组。

package main  
  
import "fmt"  
  
func main() {  
   s1 := []int{0, 1, 2, 3, 8: 100} // 通过初始化表达式构造,可使用索引号。  
   fmt.Println(s1, len(s1), cap(s1))  
   s2 := make([]int, 6, 8) // 使用 make 创建,指定 len 和 cap 值。  
   fmt.Println(s2, len(s2), cap(s2))  
   s3 := make([]int, 6) // 省略 cap,相当于 cap = len。  
   fmt.Println(s3, len(s3), cap(s3))  
  
}

输出:

[0 1 2 3 0 0 0 0 100] 9 9
[0 0 0 0 0 0] 6 8
[0 0 0 0 0 0] 6 6

切片个各种创建方式

切片与指针:

s := []int{0, 1, 2, 3}

p := &s[2]                        // *int, 获取底层数组元素指针。
*p += 100

fmt.Println(s)

输出:

[0 1 102 3]

``[][]T,是指元素类型为 []T

data := [][]int{
    []int{1, 2, 3},
    []int{100, 200},
    []int{11, 22, 33, 44},
}

可直接修改 struct array/slice 成员。

d := [5]struct {
    x int
}{}

s := d[:]

d[1].x = 10
s[2].x = 20

fmt.Println(d)
fmt.Printf("%p, %p\n", &d, &d[0])

输出:

[{0} {10} {20} {0} {0}]
0x20819c180, 0x20819c180

append

在slice的尾部添加数据,返回新的slice对象

package main  
  
import "fmt"  
  
func main() {  
   s := make([]int, 0, 5)  
   fmt.Printf("%p\n", &s)  
  
   s2 := append(s, 1)  
   fmt.Printf("%p\n", &s2)  
  
   fmt.Println(s, s2)  
  
   s3 := append(s2, 2, 3)//可以添加多个值  
   fmt.Println(s3)  
}

输出:

0xc000008078
0xc000008090
[] [1]    

可以看到两次的内存地址不一样了
可以一次添加多个值

一旦append的数据超过了切片的cap值,也就是最大容量,底层就会重新分配一个数组,就和原来的数组无关了
例如:

package main  
  
import "fmt"  
  
func main() {  
   data := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 10: 9}  
   s := data[:2:3]  
   s = append(s, 23, 34)  
  
   fmt.Println(s, data)  
   fmt.Println(&s[0], &data[0])  
}

输出:

[1 2 23 34] [1 2 3 4 5 6 7 8 0 0 9]
0xc00000e4b0 0xc000016420

可以看出底层数组被重新分配了,没有用同一个数组。

copy(切片复制)

函数 copy 在两个 slice 间复制数据,复制长度以 len 小的为准。两个 slice 可指向同一底层数组,允许元素区间重叠。

package main  
  
import "fmt"  
  
func main() {  
   data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}  
  
   s := data[8:]  
   s2 := data[:5]  
   fmt.Println(s)  
   fmt.Println(s2)  
  
   copy(s2, s) // dst:s2, src:s  
  
   fmt.Println(s2)  
   fmt.Println(data)  
}

输出:

[8 9]
[0 1 2 3 4]          
[8 9 2 3 4]          
[8 9 2 3 4 5 6 7 8 9]

大的slice复制给小的slice,上面两个slice中0和1都有元素,小的slice覆盖了打的slice。

goto

使用goto前,需先定义标签。标签区分大小写,且未使用的标签会引发编译器的错误。

package main  
  
import "fmt"  
  
func main() {  
  
   for i := 0; i < 3; i++ {  
      fmt.Println(i)  
      if i > 1 {  
         goto exit  
      }  
   }  
exit:  
   fmt.Println("exec.")  
  
}  
  
func test() {  
  
}

输出:
0
1
2
exec.

不能跳到其他函数或者内层代码上:

package main  
  
func test() {  
test:  
   println("test")  
   println("test exit.")  
}  
func main() {  
   for i := 0; i < 3; i++ {  
   loop:  
      println(i)  
   }  
   goto test  
   goto loop  
  
}

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

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

相关文章

Vue中Vue.use()的原理及基本使用

目录 &#x1f525; 前言 1. 举例理解 2. 源码分析 &#x1f525; 小结 相信很多人在用Vue使用别人的组件时,会用到 Vue.use() ,例如&#xff1a;Vue.use(VueRouter)、Vue.use(MintUI)&#xff0c;这篇文章主要给大家介绍了关于Vue中Vue.use()的原理及基本使用的相关资料&a…

Mysql索据-Mysql的innodb引擎为什么要使用b+tree作为索引数据结构?

目录 索引&#xff1f; 什么是索引&#xff1f;索引有什么优点&#xff1f;索引有什么缺点&#xff1f; 索引的分类 按照功能分类&#xff1a; 按照数据结构分类 相关数据结构&#xff08;b-tree、btree&#xff09; b-tree btree b-tree和btree的区别 为什么Innodb要…

65. 锚框的代码实现

目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;ground-truth bounding box&#xff09;。 不同的模型使用的区域采样方法可能不同。 这里我们…

TiDB学习笔记(八)-数据库故障处理

一、数据丢失快速恢复 数据恢复前置条件-GC&#xff0c;tidb_gc_life_time 查询GC已经清理的时间点tikv_gc_safe_point 数据快速恢复操作方式 DML->tidb_snapshot参数 &#xff08;在tikv_gc_safe_point范围内&#xff09; DDL->flashback table/recover table (flas…

AIGC与搜索深度融合,百度定义“生成式搜索”

设想一下&#xff0c;当你搜索“公司活动通知怎么写”时&#xff0c;搜索引擎直接“写”了一篇送到眼前是什么体验&#xff1f;百度的“生成式搜索”正在让这样的场景成为现实。日前&#xff0c;百度宣布&#xff0c;百度搜索将升级“生成式搜索”能力&#xff0c;基于百度自研…

项目管理工具dhtmlxGantt甘特图入门教程(七):在服务器上使用甘特图

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理控件应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 这篇文章给大家讲解如何在服务器上使用DHTMLX Gantt 。 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764…

Cadence PCB仿真使用Allegro PCB SI元器件类别设置为IO,IC和Discrete的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件配置电压地网络电压的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

ElementUI源码系列一-完整引入和按需引入

前言 本篇将介绍&#xff0c;ElementUI 是如何实现完整引入和按需引入的。 完整引入 官网使用 源码步骤 src/index.js 通过对外暴露 install()&#xff0c;让主项目通过 Vue.use(ElementUI) 引入&#xff0c;还需单独引入样式 import element-ui/lib/theme-chalk/index.c…

Selenium用法详解【Options选项】【JAVA爬虫】

简介本文主要讲解如何使用java代码利用selenium控制浏览器的启动选项Options的代码操作教程。Options选项这是一个Chrome的参数对象&#xff0c;在此对象中使用addArgument()方法可以添加启动参数&#xff0c;添加完毕后可以在初始化Webdriver对象时将此Options对象传入&#x…

minio分布式存储的go语言开发衔接

minio是分布式存储&#xff0c;可集群部署&#xff0c;阵列磁盘&#xff0c;纠错码等大数据存储必备的技术。由于它是go语言开发的&#xff0c;我们用go来与它衔接&#xff1a;上传文件&#xff0c;比如图片&#xff0c;然后预览。这里涉及几个重要的知识点。一是minio永久路径…

Vue学习笔记(二)

Vue学习笔记二脚手架利用脚手架软件生成项目包脚手架 随着时代的发展, WEB开发逐渐出现了 工程化 特征: 流水线作业! 脚本方式: 到饭店 自选点餐… 脚手架方式: 点 套餐, 一套完善的配置,扩展, 各种易用功能… 脚手架: 就是一款软件, 可以按照用户需求自动生成 开发环境: 包含…

[博士论文]基于图数据的可信赖机器学习

密歇根大学Towards Trustworthy Machine Learning on Graph Datahttps://deepblue.lib.umich.edu/handle/2027.42/174201摘要机器学习已经被应用于越来越多影响我们日常生活的与社会相关的场景&#xff0c;从社交媒体和电子商务到自动驾驶汽车和刑事司法。因此&#xff0c;为了…

7-2 洛希极限

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时&#xff0c;大气开始被木星吸走&#xff0c;而随着不断接近地木“刚体洛希极限”&#xff0c;地球面临被彻底撕碎的危险。但实际上&#xff0c;这个计算是错误的。 洛希极限&#xff08;Roche limit&#xff09;是一…

用Python实现十大经典排序算法(附动图)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排…

69、CLIP-NeRF: Text-and-Image Driven Manipulation of Neural Radiance Fields

简介 官网&#xff1a;https://cassiepython.github.io/clipnerf/ 利用对比语言-图像预训练(CLIP)模型的联合语言-图像嵌入空间&#xff0c;提出了一个统一的框架&#xff0c;可以用短文本提示或示例图像以用户友好的方式操纵NeRF。改论文结合NeRF的新视图合成能力和生成模型潜…

【自学Python】Python缩进规则

Python缩进规则 Python缩进规则教程 Python 和其它程序设计语言采用大括号 {} 分隔代码块不同&#xff0c;Python 采用代码缩进和冒号来区分代码块之间的层次。 在 Python 中&#xff0c;对于 类定义、函数定义、流程控制语句、异常处理语句 等&#xff0c;行尾的冒号和下一…

【Linux篇】之TFTP服务配置

tftp是基于UDP协议的简单文本文件传输协议&#xff1b; 用途&#xff1a;使用网络的方式将文件传输(下载)到开发板中。 具体的tftp服务的安装步骤&#xff1a; 1> 安装tftp服务 (ubuntu必须可以上网) sudo apt-get update ----> 更新源 sudo apt-get install tftpd-hpa…

【MyBatis】如何使用“动态SQL”(不用找了,这一篇足矣)

目录 一、if标签 二、where标签 三、trim标签 四、choose、when、otherwise 五、foreach标签 六、sql标签 一、if标签 if&#xff0c;通过test属性中的表达式判断标签中的内容是否有效&#xff08;有效才将if里面的内容拼接到sql中&#xff09;&#xff1b;一般用于用户在…

Authing 通过中国信通院「身份治理系统和工具能力」全面级评估

Authing 通过中国信通院「身份治理系统和工具能力」全面级评估 近期&#xff0c;Authing 荣获由中国信通院颁发的「身份治理系统和工具能力」全面级评估。在统一身份管理、统一认证管理、开发集成管理以及统一安全管理四个模块满足身份治理系统和工具支撑能力全面级要求。 评估…

Java--main()方法

文章目录一、main()方法使用二、mian()方法调用一、main()方法使用 1、访问控制权限是公有的&#xff08;public&#xff09; 2、main() 方法是静态的。如果要在 main() 方法中调用本类中的其他方法&#xff0c;则该方法也必须是静态的&#xff0c;否则需要先创建本类的实例对…