百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

对比着学 Go 语言-基础:类型之数组

bigegpt 2024-10-12 05:07 9 浏览

数组是 Go 语言编程中最常用的数据结构。

数组的常规声明方法有:

[32]byte                        // 长度为 32 的数组,每个元素为一个字节
[2*N] struct {x, y int32} // 复杂类型数组
[1000] * float64            // 指针数组
[3][5]int                        // 二维数组
[2][2][2]float64            //  等同于[2]([2]([2]float64))

在 Go 语言中, 数组长度在定义后就不可更改,在声明时长度可以为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。

数组的长度是该数组类型的一个内置常量,可以用 Go 语言的内置函数 len() 来获取。

arrlength := len(arr)

数组元素的访问:

for i := 0; i<len(array); i++ {
    fmt.Println("Element", i, "of array is", array[i]) 
}

Go 和 Python 一样也有关键字 range, 它的功能就是遍历容器中的元素。数组也是 range 的支持范围之一。

for i, v := range array {
    fmt.Println("Array element[", i, "]=", v) 
}

range 具有两个返回值,第一个返回值是元素的数组下标,第二个返回值是元素的值。

数组内值类型

值类型的概念有 1 个特点:

  • 在赋值和作为参数传递时,将产生一次复制动作。
package main
import "fmt"

func modify(array [5]int){
     array[0] = 10 //试图修改数组的第一个元素
     fmt.Println("In modify(), array values:", array)
}

# 函数 modify 内操作的那个数组跟 main 中传入的数组是两个不同的实例。
func main(){
     array := [5]int{1, 2, 3, 4, 5} // 定义并初始化一个数组
     modify(array)  //传递给一个函数,并试图在函数体内修改这个数组内容
     fmt.Println("In main(), array values:", array)
}

Go 语言和 Python 非常相似的地方就是数组切片操作。

数组的特点是:

  1. 长度在定义之后无法再次修改
  2. 每传递一次都会产生一份副本。

而切片作为指向数组的指针,同时拥有:

  1. 指向原数组的指针
  2. 元素个数
  3. 已分配的存储空间

这是一个完整的数据结构。只是在底层仍然使用数组来管理元素。

数组切片基于数组添加了一系列管理功能,可以随时动态扩充存放空间,并且可以被随意传递而不会导致所管理的元素被重复复制。

下面从 3 个方面来考察数组切片:

  • 创建数组切片
  • 基于数组切片创建数组切片
  • 元素遍历
  • 动态增减元素
  • 内容复制

创建

package main
import "fmt"

func main() {
  var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  var mySlice []int = myArray[:5]
  
  fmt.Println("Elements of myArray: ")
  for _, v := range myArray {
      fmt.Print(v, " ") 
  }
  
  fmt.Println("\n Elements of mySlice: ")
  for _, v := range mySlice {
      fmt.Print(v, " ")
  }
  
  fmt.Println()
  
}

可以看到,这里切片的操作和 Python 是一模一样的。

mySlice = myArray[:]
mySlice = myArray[:5]
mySlice = myArray[5:]

以上的方式都是基于数组来创建的,下面是通过元素直接创建:

mySlice1 := make([]int, 5) // 创建一个初始元素个数为 5 的数组切片,元素初始值为 0
mySlice2 := make([]int, 5, 10) // 创建一个初始元素个数为 5 的数组切片,元素初始值为 0, 并预留 10 个元素的存储空间
mySlice3 := []int{1, 2, 3, 4, 5}

这中间是会有匿名数组被创建出来的,但不需要操心。

还可以基于数组切片创建数组切片,和基于数组创建切片的不同之处在于,数组定长,数组切片不定长。也是基于这个特点,新的切片可以选择到旧切片的范围外,范围外的元素在新切片中会被填上 0 。

oldSlice := []int{1, 2, 3, 4, 5}
newSlice := oldSlice[:6]


遍历

数组切片可以兼容所有操作数组的方法。

# 数组切片的遍历
for i := 0; i < len(mySlice); i++ {
    fmt.Println("mySlice[", i, "] =", mySlice[i])
}


for i, v := range mySlice {
    fmt.Println("mySlice[", i, "] = ", v) 
}

动态增减

与数组相比,数组切片多了一个存储能力的概念,其元素个数和分配的空间可以是两个不同的值。

package main
import "fmt"

func main() {
   mySlice := make([]int, 5, 10)
  
  fmt.Println("len(mySlice):", len(mySlice)) // len 返回的是数组切片中当前所存储元素个数
  fmt.Println("cap(mySlice):", cap(mySlice)) // cap 返回的数组切片分配的空间大小
}

增加的方法和像数组中追加元素的方法一样,使用 append() 函数, 它的第二个参数是一个不定参数。

mySlice = append(mySlice, 1, 2, 3)


mySlice2 := []int{8, 9, 10}
mySlice = append(mySlice, mySlice2...)

和 Python 一样,Go 也存在省略号。相当于把 mySlice2 包含的所有元素打散后传入。等同于下面:

mySlice = append(mySlice, 8, 9, 10)

数组切片会自动处理存储空间不足的问题。

内容复制

和 Python 一样,Go 也存在内置函数 copy(), 它执行的是将一个切片复制到另一个切片。当两个切片大小不一,却要执行复制操作时,就会按照较小的那个切片个数进行复制。

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}

copy(slice2, slice1) // 只会复制 slice1 的前 3 个元素到 slice2 中
copy(slice1, slice2) // 只会复制 slice2 的 3 个元素到 slice1 的前 3 个位置

相关推荐

方差分析简介(方差分析通俗理解)

介绍方差分析(ANOVA,AnalysisofVariance)是一种广泛使用的统计方法,用于比较两个或多个组之间的均值。单因素方差分析是方差分析的一种变体,旨在检测三个或更多分类组的均值是否存在...

正如404页面所预示,猴子正成为断网元凶--吧嗒吧嗒真好吃

吧嗒吧嗒,绘图:MakiNaro你可以通过加热、冰冻、水淹、模塑、甚至压溃压力来使网络光缆硬化。但用猴子显然是不行的。光缆那新挤压成型的塑料外皮太尼玛诱人了,无法阻挡一场试吃盛宴的举行。印度政府正...

Python数据可视化:箱线图多种库画法

概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)...

多组独立(完全随机设计)样本秩和检验的SPSS操作教程及结果解读

作者/风仕在上一期,我们已经讲完了两组独立样本秩和检验的SPSS操作教程及结果解读,这期开始讲多组独立样本秩和检验,我们主要从多组独立样本秩和检验介绍、两组独立样本秩和检验使用条件及案例的SPSS操作...

方差分析 in R语言 and Excel(方差分析r语言例题)

今天来写一篇实际中比较实用的分析方法,方差分析。通过方差分析,我们可以确定组别之间的差异是否超出了由于随机因素引起的差异范围。方差分析分为单因素方差分析和多因素方差分析,这一篇先介绍一下单因素方差分析...

可视化:前端数据可视化插件大盘点 图表/图谱/地图/关系图

前端数据可视化插件大盘点图表/图谱/地图/关系图全有在大数据时代,很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,开发人员很多时候需要使用图表来表现一些数据。随着Web技术的...

matplotlib 必知的 15 个图(matplotlib各种图)

施工专题,我已完成20篇,施工系列几乎覆盖Python完整技术栈,目标只总结实践中最实用的东西,直击问题本质,快速帮助读者们入门和进阶:1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编...

R ggplot2常用图表绘制指南(ggplot2绘制折线图)

ggplot2是R语言中强大的数据可视化包,基于“图形语法”(GrammarofGraphics),通过分层方式构建图表。以下是常用图表命令的详细指南,涵盖基本语法、常见图表类型及示例,适合...

Python数据可视化:从Pandas基础到Seaborn高级应用

数据可视化是数据分析中不可或缺的一环,它能帮助我们直观理解数据模式和趋势。本文将全面介绍Python中最常用的三种可视化方法。Pandas内置绘图功能Pandas基于Matplotlib提供了简洁的绘...

Python 数据可视化常用命令备忘录

本文提供了一个全面的Python数据可视化备忘单,适用于探索性数据分析(EDA)。该备忘单涵盖了单变量分析、双变量分析、多变量分析、时间序列分析、文本数据分析、可视化定制以及保存与显示等内容。所...

统计图的种类(统计图的种类及特点图片)

统计图是利用几何图形或具体事物的形象和地图等形式来表现社会经济现象数量特征和数量关系的图形。以下是几种常见的统计图类型及其适用场景:1.条形图(BarChart)条形图是用矩形条的高度或长度来表示...

实测,大模型谁更懂数据可视化?(数据可视化和可视化分析的主要模型)

大家好,我是Ai学习的老章看论文时,经常看到漂亮的图表,很多不知道是用什么工具绘制的,或者很想复刻类似图表。实测,大模型LaTeX公式识别,出乎预料前文,我用Kimi、Qwen-3-235B...

通过AI提示词让Deepseek快速生成各种类型的图表制作

在数据分析和可视化领域,图表是传达信息的重要工具。然而,传统图表制作往往需要专业的软件和一定的技术知识。本文将介绍如何通过AI提示词,利用Deepseek快速生成各种类型的图表,包括柱状图、折线图、饼...

数据可视化:解析箱线图(box plot)

箱线图/盒须图(boxplot)是数据分布的图形表示,由五个摘要组成:最小值、第一四分位数(25th百分位数)、中位数、第三四分位数(75th百分位数)和最大值。箱子代表四分位距(IQR)。IQR是...

[seaborn] seaborn学习笔记1-箱形图Boxplot

1箱形图Boxplot(代码下载)Boxplot可能是最常见的图形类型之一。它能够很好表示数据中的分布规律。箱型图方框的末尾显示了上下四分位数。极线显示最高和最低值,不包括异常值。seaborn中...