【Go】Go语言中的数组基本语法与应用实战

news2024/11/24 8:32:47

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言数组
    • 什么是数组
    • 数组的基本用法
      • 1. 数组的声明
      • 2. 数组几个特点:
      • 3. 数组的定义方式
      • 4. 初始化数组的几种方式
    • 数组是值类型
    • 数组排序
      • 算法:冒泡排序
    • 多维数组

Go语言数组

Go语言中的数组(Array)和切片(Slice)是处理数据的两种重要数据结构。
数组是一种相同数据类型、并且具有固定长度的序列,而切片则是对数组或另一个切片的一个连续片段的引用,提供了一种灵活且强大的方式来操作数据集合。

什么是数组

  • 一组数
    • 数组需要是相同类型的数据的集合
    • 数组是需要定义大小的
    • 数组一旦定义了大小是不可以改变的。

数组的基本用法

1. 数组的声明

数组和其他变量定义没什么区别,唯一的就是这个是一组数,需要给一个大小 [6]int [10]string
数组是一个相同类型数据的有序集合,通过下标来取出对应的数据

2. 数组几个特点:

1、长度必须是确定的,如果不确定,就不是数组,大小不可以改变
2、元素必须是相,同类型不能多个类型混合, [any也是类型,可以存放任意类型的数据]
3、数组的中的元素类型,可以是我们学的所有的类型,int、string、float、bool、array、slice、map

3. 数组的定义方式

数组的定义: [数组的大小size] 变量的类型 ,
我们定义了一组这个类型的数组集合,大小为size,最多可以保存size个数

定义了数组数据类型, 数组中的数据必须使用同一种数据类型,否则报错

package main

import "fmt"

func main() {
    //定义数组: [数组的大小size] 变量的类型
    //定义了数据类型,数组里面必须使用同一种数据类型
        //定义了数组长度,如果某个下标未赋值,会给出其数据类型的默认值

    var a = [5]int{1, 2, 3, 4, "5"}
    fmt.Println(a)

}

在这里插入图片描述

数组赋值:
声明数组长度和数据类型

var a [5]int
// 给数组赋值,下标index,所有的数组下标都是从0开始的。
a[0] = 100
a[1] = 200
a[2] = 300
a[3] = 400
a[4] = 500

打印数组
fmt.Println(a)


通过下标方式获取数组某元素
fmt.Println(a[1])

在这里插入图片描述
在这里插入图片描述

获取数组长度和数组容量
数组中的常用方法 len()获取数组的长度 cap() 获取数组的容量
数组的容量在定义后就不能更改,而切片的容量在定义后可以更改。

fmt.Println("数组长度:", len(a))
fmt.Println("数组容量", cap(a))

在这里插入图片描述

修改数组的值,直接通过下标修改

a[2] = 3000
fmt.Println(a)
fmt.Println(a[2])

在这里插入图片描述

完整代码:

package main

import "fmt"

// 数组
// 数组和其他变量定义没什么区别,唯一的就是这个是一组数,需要给一个大小  [6]int   [10]string
// 数组是一个相同类型数据的==有序==集合,通过下标来取出对应的数据
// 数组几个特点:
// 1、长度必须是确定的,如果不确定,就不是数组,大小不可以改变
// 2、元素必须是相,同类型不能多个类型混合, [any也是类型,可以存放任意类型的数据]
// 3、数组的中的元素类型,可以是我们学的所有的类型,int、string、float、bool、array、slice、map

func main() {
    //数组本身也是一种数据类型
    //定义数组: [数组的大小size] 变量的类型
    //定义了数据类型,数组里面必须使用同一种数据类型
    //声明数组长度和数据类型
    var a [5]int
    // 给数组赋值,下标index,所有的数组下标都是从0开始的。
    //定义了数组长度,如果某个下标未赋值,会给出其数据类型的默认值
    a[0] = 100
    a[1] = 200
    a[2] = 300
    a[3] = 400
    a[4] = 500

    //打印数组
    fmt.Println(a)

    //取出数组中的某元素
    fmt.Println(a[1])

    //数组中的常用方法 len()获取数组的长度  cap() 获取数组的容量
    fmt.Println("数组长度:", len(a))
    fmt.Println("数组容量", cap(a))

    //修改数组的值
    a[2] = 3000
    fmt.Println(a)
    fmt.Println(a[2])

}

4. 初始化数组的几种方式

1.在定义数组的时候就直接初始化,用大括号包裹数组的值

var arr1 = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr1)

在这里插入图片描述

2.短变量快速初始化

arr2 := [3]int{1, 2, 3}
fmt.Println(arr2)

在这里插入图片描述

  1. 自动根据数组的长度来给 … 赋值,自动推导长度
    数据如果来自用户,我不知道用户给我多少个数据,数组
    … 代表数组的长度
    Go的编译器会自动根据数组的长度来给 … 赋值,自动推导长度
    注意点:这里的数组不是无限长的,也是固定的大小,大小取决于数组元素个数。
var arr3 = [...]int{1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8}
fmt.Println(len(arr3))
fmt.Println(arr3)

在这里插入图片描述

  1. 数组默认值,我只想给其中的某几个index位置赋值。
    {index:值}
var arr4 [10]int
arr4 = [10]int{1: 100, 5: 500}
fmt.Println(arr4) // [0 100 0 0 0 500 0 0 0 0]

给赋值的下标有值,没赋值的下标是默认值
在这里插入图片描述

完整代码:

package main

import "fmt"

func main() {
    // 在定义数组的时候就直接初始化,用大括号包裹数组的值
    var arr1 = [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr1)

    //短变量快速初始化
    arr2 := [3]int{1, 2, 3}
    fmt.Println(arr2)

    // 比较特殊的点
    // 数据如果来自用户,我不知道用户给我多少个数据,数组
    // ... 代表数组的长度
    // Go的编译器会自动根据数组的长度来给 ... 赋值,自动推导长度
    // 注意点:这里的数组不是无限长的,也是固定的大小,大小取决于数组元素个数。
    //var arr3 = [...]int{1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8}
    arr3 := [...]int{1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8}
    fmt.Println(len(arr3))
    fmt.Println(arr3)

    // 数组默认值,我只想给其中的某几个index位置赋值。
    // {index:值}
    var arr4 [10]int
    arr4 = [10]int{1: 100, 5: 500}
    fmt.Println(arr4) // [0 100 0 0 0 500 0 0 0 0]
}


遍历数组元素
遍历数组可以通过下标获取元素 arr[index]、使用for循环或者for-range结构。
直接通过下标获取元素 arr[index]

使用for循环遍历:
for i := 0; i < len(arr); i++ {  
    fmt.Println(arr[i])  
}

使用for-range遍历:
for index, value := range arr {  
    fmt.Printf("Index: %d, Value: %d\n", index, value)  
}

goland 快捷方式 数组.forr,来循环数组。
在这里插入图片描述

切片很多时候都使用for range
for 下标,下标对应的值 range 目标数组切片
就是将数组进行自动迭代。返回两个值 index、value
注意点,如果只接收一个值,这个时候返回的是数组的下标
注意点,如果只接收两个值,这个时候返回的是数组的下标和下标对应的值

package main

import "fmt"

/*
1、直接通过下标获取元素 arr[index]

2、 0-len i++ 可以使用for循环来结合数组下标进行遍历

3、for range:范围   (new)
*/
func main() {

    var arr1 = [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr1[0])
    fmt.Println(arr1[1])
    fmt.Println(arr1[2])
    fmt.Println(arr1[3])
    fmt.Println(arr1[4])
    // 错误:index 5 out of bounds [0:5] 数组下标越界
    // 数组的长度只有5,你要取出6个元素,不可能取出
    //fmt.Println(arr1[5])
    fmt.Println("------------------")
    // 获取数组的长度  len()
    // 下标从0开始,不能<=
    for i := 0; i < len(arr1); i++ {
        fmt.Println(arr1[i])
    }
    fmt.Println("------------------")
    // goland 快捷方式 数组.forr,未来循环数组、切片很多时候都使用for    range
    // for 下标,下标对应的值  range 目标数组切片
    // 就是将数组进行自动迭代。返回两个值 index、value
    // 注意点,如果只接收一个值,这个时候返回的是数组的下标
    // 注意点,如果只接收两个值,这个时候返回的是数组的下标和下标对应的值
    // 如果我们只想要数组的值,index可以用_匿名变量来接收
    for _, value := range arr1 {
        fmt.Println(value)
    }

}

在这里插入图片描述

数组是值类型

所有的赋值后的对象修改值后不影响原来的对象,赋值后的对象和原对象是互相独立的
验证值传递还是引用传递一个很好的方式就是:赋值后修改值,看是否影响原来的变量值,如果不影响就是值传递,影响了就是引用传递
在这里插入图片描述

package main

import "fmt"

// 数组是值类型: 所有的赋值后的对象修改值后不影响原来的对象。
func main() {
    //数组类型的样子 [size]type
    arr1 := [4]int{1, 2, 3, 4}
    arr2 := [5]string{"景天", "科技"}
    //字符串类型的值不写,默认是空串
    fmt.Println(arr1, "\n", arr2)
    fmt.Printf("%T\n", arr1) // [4]int
    fmt.Printf("%T\n", arr2) // [5]string

    // 数组的值传递和int等基本类型一致
    arr3 := arr1
    fmt.Println(arr1)
    fmt.Println(arr3)

    // 修改arr3观察arr1是否会变化
    arr3[0] = 12
    fmt.Println(arr1)
    fmt.Println(arr3) // 数组是值传递,拷贝一个新的内存空间
}

可见修改赋值后的变量值,不影响原来变量的值,得知数组是值传递
在这里插入图片描述

数组排序

数组的排序,一组数是乱序的,我们如何将它按照升序或者降序排列。

常见的排序算法:冒泡排序、插入排序、选择排序、希尔排序、堆排序、快速排序、归并排序、基数排序…
在这里插入图片描述

arr := [6]int{1,2,3,4,5,0}
// 升序 ASC  : 从小到大  0,1,2,3,4,5   A-Z    00:00-24:00
// 降序 DESC : 从大到小  5,4,3,2,1,0

数据结构:数组就是最简单的数据结构之一

算法:冒泡排序

package main

import "fmt"

// 冒泡:每次筛选出一个最大或者最小的数.
/*
index   0   1   2   3   4
value   12  99  79  48  55
*/
// 冒泡排序逻辑,两两比较,大的往后移或者前移。 大
// 第一轮 : 12 79 48 55 99 // 5
// 第二轮 : 12 48 55 79 99 // 4
// 第三轮 : 12 48 55 79 99 // 3 //
// 第四轮 : 12 48 55 79 99 //
// 第五轮 : 12 48 55 79 99

// 代码实践
/*
    // 两个数判断,如果一个数大,则交换位置,大放到后面
    if arr[x] > arr[x+1] {
        arr[x], arr[x+1] = arr[x+1],arr[x]
    }
    // 多轮判断,for, 循环次数 【数组大小】
*/
func main() {

    arr := [...]int{12, 99, 79, 48, 55, 1, 110, 111, 23, 52, 354, 2, 3412, 3, 12, 31}
    fmt.Println("初始数组:", arr)
    // 冒泡排序
    // 1、多少轮
    for i := 1; i < len(arr); i++ {
        // 2、筛选出来最大数字以后,我们下次不需要将它再计算了
        for j := 0; j < len(arr)-i; j++ {
            // 比较 // 改变升降序只需要改变符号即可
            if arr[j] < arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }

        }
        fmt.Println("第", i, "交换:", arr)
    }

}

我们看到在第12次交换后,其实已经排序好了,但是循环还在继续
在这里插入图片描述

为了节省计算机资源,我们希望排序完之后不再继续进行比较了,怎么实现呢?
看如下代码
临时变量检测法

package main

import "fmt"

func main() {
    a := [...]int{21, 72, 564, 27, -12, 0, 32, 999, 54, 81}
    //打印最初数组
    fmt.Println("最初数组", a)

    //冒泡排序
    for i := 1; i < len(a); i++ {
        //交换之前先将a赋值给一个临时变量。当交换结束,a与临时变量相同,表示已经排序完成
        temp := a
        //筛选出来最大数字后就不需要再次进行比较了
        for j := 0; j < len(a)-i; j++ {
            if a[j] > a[j+1] {
                a[j], a[j+1] = a[j+1], a[j]
            }

        }
        //排序好后结束循环
        //交换完成判断,a是否发生了变化,如果没变表示排序结束,结束循环
        if a == temp {
            break
        }

        fmt.Println("第", i, "次交换", a)

    }
    fmt.Println("排序后的数组:", a)

}

在这里插入图片描述

多维数组

一维数组: 线性的,一组数

二维数组: 表格性的,数组套数组

三维数组: 立体空间性的,数组套数组套数组

xxxx维数组:xxx,数组套数组套数组…

在这里插入图片描述

在这里插入图片描述

用法代码展示

package main

import "fmt"

func main() {

    // 定义一个多维数组  二维

    arr := [3][4]int{
        {0, 1, 2, 3},   // arr[0]  //数组
        {4, 5, 6, 7},   // arr[1]
        {8, 9, 10, 11}, // arr[2]
    }
    // 二维数组,一维数组存放的是一个数组
    fmt.Println(arr[0])
    // 要获取这个二维数组中的某个值,找到对应一维数组的坐标,arr[0] 当做一个整体
    fmt.Println(arr[0][1])
    fmt.Println("------------------")
    // 如何遍历二维数组
    for i := 0; i < len(arr); i++ {
        for j := 0; j < len(arr[i]); j++ {
            fmt.Println(arr[i][j])
        }
    }
    // for range
    for i, v := range arr {
        fmt.Println(i, v)
    }
}

在这里插入图片描述

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

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

相关文章

GUI编程13:JDialog弹窗

视频链接&#xff1a;15、JDialog弹窗_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p15&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 package com.yundait.lesson04;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; im…

为你的 Github 仓库引入自动构建的Github Pages静态页面

1. 设置config文件 在Github仓库根目录下创建_config.yml文件。其中的内容为&#xff1a; plugins:- jekyll-relative-links relative_links:enabled: truecollections: true include:- CONTRIBUTING.md- README.md- LICENSE.md- COPYING.md- CODE_OF_CONDUCT.md- CONTRIBUTI…

通过解预测和机器学习促进蚁群优化

文章目录 Abstract1. Introduction2. Background and related work2.1 定向越野问题2.2 ACO优化Abstract ML - ACO 算法的第一阶段,使用一组已知最优解的小定向越野问题实例训练一个 ML 模型。具体来说,使用分类模型根据问题特定的特征和统计度量来判断一条边是否属于最优路…

SSH工具 MobaXterm的使用与快捷配置

软件下载/安装与链接服务器/本地虚拟机 文章目录 软件下载/安装与链接服务器/本地虚拟机软件下载软件安装使用软件链接非本地机器并设置用户密码我不想有确定密码的弹窗 其余便捷配置配置右键粘贴SSH链接设置 软件下载 如果你访问不了这个网址&#xff0c;可以评论区找博主或者…

黑神话悟空黑风山攻略

在黑神话悟空中&#xff0c;玩家一开始来到黑风山的地图就会站在前山土地庙。 下面小编将会根据黑风山地图的地标来进行路线攻略推荐&#xff0c; 玩家可以一边查看游戏地图一边了解这些路线的动线是怎样的。 在苍狼林前山捡到药材老山参&#xff0c;跟随金色光线找到附近的土…

【机器学习】:解锁数据背后的智慧宝藏——深度探索与未来展望

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言一、深入机器学习的内在机制二、最新进展与趋势三、对未来社会的深远影响结语 引言 在上一篇博客中&#xff0c;我们初步探讨了机器学习如何成为解锁数据背后智慧的关键工具。现在&#xff0c;让…

网盘隐私照片泄露?教你如何保护自己的隐私照片!

网盘内的隐私照片 好兄弟最近遇到了一个困难&#xff1a;“我之前一直都是把照片存在网盘里面的&#xff0c;但是最近听说了某网盘的照片泄露了&#xff0c;自己的生活照啊&#xff0c;私密照啊都被人看光了&#xff0c;这太可怕了&#xff01;我现在也很担心自己的网盘上照片…

Android MediaPlayer + GLSurfaceView 播放视频

Android使用OpenGL 播放视频 概述TextureView的优缺点OpenGL的优缺点 实现复杂图形效果的场景参考 概述 在Android开发中&#xff0c;使用OpenGL ES来渲染视频是一种常见的需求&#xff0c;尤其是在需要实现自定义的视频播放界面或者视频特效时。结合MediaPlayer&#xff0c;我…

Java后端框架---Spring

目录 一.Spring是什么&#xff1f; 二.Spring Hello World 搭建 三.XML配置bean管理 1.bean标签 2.依赖注入 3.依赖注入的补充 四.注解配置bean管理 1.开启注解扫描 2.使用注解对类进行配置 3.自动注入 五.面向切面编程AOP 1.概述 2.通知 六.spring事务管理 1.数据库…

双三次插值及MATLAB实现

一、双三次插值的概念 双三次插值&#xff08;Bicubic interpolation&#xff09;&#xff0c;又叫双立方插值。在数值分析这个数学分支中&#xff0c;双三次插值是二维空间中最常用的插值方法。在这种方法中&#xff0c;函数f在点 (x0 ,y0) 的值不仅考虑其直接邻接点对其的影响…

MySQL —— 索引

索引的概念 MySQL的索引是⼀种数据结构&#xff0c;它可以帮助数据库高效地查询、更新数据表中的数据。索引通过 ⼀定的规则排列数据表中的记录&#xff0c;使得对表的查询可以通过对索引的搜索来加快速度。 MySQL索引类似于书籍的目录&#xff0c;通过指向数据行的位置&…

Flutter Error: Type ‘UnmodifiableUint8ListView‘ not found

问题描述 原本我在Mac开发的项目&#xff0c;现在win10运行时报如下错误&#xff1a; ../../../AppData/Local/Pub/Cache/hosted/pub.dev/win32-3.1.4/lib/src/guid.dart:31:9: Error: Type UnmodifiableUint8ListView not found. final UnmodifiableUint8ListView bytes; ^^…

C# 异步编程场景

前言 异步编程允许程序在等待某些操作&#xff08;如文件读写、网络请求等&#xff09;完成时&#xff0c;不必阻塞主线程&#xff0c;从而可以继续执行其他任务。这种非阻塞的特性对于提高应用程序的并发性和响应速度至关重要。C# 通过 async 和 await 关键字&#xff0c;以及…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

828华为云征文 | 云服务器Flexus X实例:部署 AgentOps,全方位监测智能体

目录 一、什么是 AgentOps ? 二、部署 AgentOps 2.1 安装 AgentOps 2.2 注册账号 2.3 生成 API_KEY 三、AgentOps 实例 3.1 创建实例 3.2 运行实例 四、总结 通过深入体验华为云的 Flexus云服务器X实例&#xff0c;我发现它不仅提供了直接通过公网访问的便利性&#…

【 html+css 绚丽Loading 】 000049 流云穿梭环

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

回归预测|基于遗传优化卷积神经网络的数据回归预测Matlab程序GA-CNN 多特征输入单输出 附赠基础CNN

回归预测|基于遗传优化卷积神经网络的数据回归预测Matlab程序GA-CNN 多特征输入单输出 附赠基础CNN 文章目录 一、基本原理1. 卷积神经网络&#xff08;CNN&#xff09;2. 遗传算法&#xff08;GA&#xff09;3. GA-CNN回归预测模型总结 二、实验结果三、核心代码四、代码获取五…

智能BI项目第一期

该项目是全程跟着鱼皮,还未进行功能扩展。为了方便日后复习,打算将一些重要的步骤记录下来。 项目概述 BI:即商业智能:Business Intelligence 过去 需要手动导入数据、选择要分析的字段和图表&#xff0c;并由专业的数据分析师完成分析&#xff0c;最后得出结论。 现在 用户…

docker发布redis容器

1.导入redis镜像 2.写docker-compose文件 并创建容器 redis:container_name: redisimage: redis:latestports:- "6379:6379"restart: always 3.测试一下

“深入解析:MySQL半同步复制的配置指南与实践技巧“

本次配置是在已搭建好主从复制的架构中进行配置 配置环境 操作系统 master节点 slave节点 centos7 8.0.37 8.0.37 配置半同步复制 配置master 安装master半同步复制插件 INSTALL PLUGIN rpl_semi_sync_source SONAME semisync_source.so; 在MySQL的配置文件中添加配置…