Go_数组遍历、最大值、求和、多维数组

数组:

  • 数组就是用来存储数据的容器,存储多个数据时数据类型要一致。如果想要保存任意类型数据,需要声明为接口类型数组
  • 数组定义完成后,可以对数组进行赋值操作。数组是通过下标来进行操作的,下标的范围是从0开始到数组长度减1的位置

特点:

  1. 数组是一种引用数据类型
  2. 数组当中的多个数据,类型必须统一
  3. 数组的长度在程序运行期间不可改变

索引:

数组创建完成后,会在数组内开辟多个连续的空间,空间具体有多少是根据定义的长度决定的,而索引就是每个小空间的编号,编号是从0开始依次叠加,是用来获取数组中的数据的。数组在创建完毕后,即使没有赋值,也可以取出,但取出的元素都是默认初始化值,初始值根据数据类型而定。

数组静态初始化:

初始化:创建完后马上赋值的行为叫初始化
静态初始化:在创建数组时,直接将元素确定
动态初始化:go中只有静态,但是可以使用切片完成动态数组的操作,但是切片不是数组

定义格式:

var 数组名 [元素数量] 数据类型 
var arr [5] int

静态初始化格式1:

var 数组名 [元素数量] 数据类型  = [元素数量] 数据类型 {数据1,数据2,数据3...}
var arr [5] int = [5] int {0,1,2,3,4,5}
var arr = [5] int {0,1,2,3,4,5}	// 可以简化成这样写

静态初始化格式2:

数组名 := [元素数量] 数据类型 {数据1,数据2,数据3...}
arr := [5]int{1, 2, 3, 4, 5}

部分初始化:

// 定义了5的长度,最多给5个数据,可以少不可以多,否则报越界异常,初始化是按照顺序的,写了两个,就等于索引0和1才有数据,其它都是默认0
arr := [5] int {1,2}

指定元素初始化:

数组名 := [元素数量] 数据类型 {索引1:数据,索引2:数据}
arr := [5] int {0:1,1:2}

自动推导方式初始化:

数组名 := [...] 数据类型{数据1,数据2,数据3}
arr := [...] int {0:1,1:2}

访问数组元素:

数组名 [索引]
arr[0]

演示:

func main() {// 仅定义,未初始化var arr [5]intfmt.Println("arr的数据:", arr)// 静态初始化格式1:var arr2 [5]int = [5]int{1, 2, 3, 4, 5}fmt.Println("初始化格式1:", arr2, arr2[1])// 静态初始化格式2:arr3 := [5]int{1, 2, 3, 4, 5}fmt.Println("初始化格式2:", arr3[1])// 部分初始化:未初始化的数据自动填充默认值arr4 := [5]int{1, 2}fmt.Println("部分初始化:", arr4, arr[2])// 指定索引初始化:arr5 := [5]int{0: 1, 1: 2}fmt.Println("部分初始化:", arr5, arr5[0])// 类型推导:三个点就像是变参一样arr6 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}fmt.Println("推导类型:", arr6, arr6[1])// 初始化也可以先定义,再逐个赋值var arr7 [5]intarr7[0] = 1arr7[1] = 2fmt.Println("arr7:", arr7)
}

输出:

arr的数据: [0 0 0 0 0]
初始化格式1[1 2 3 4 5] 2
初始化格式22
部分初始化: [1 2 0 0 0] 0
部分初始化: [1 2 0 0 0] 1
推导类型: [1 2 3 4 5 6 7 8 9 10] 2
arr7: [1 2 0 0 0]

数组长度是类型的一部分,也就是说,元素类型相同,但数组长度不同的不属同一类型

func main() {var d1 [3]intvar d2 [2]intd1 = d2 // 错误: 无法将 'd2' (类型 [2]int) 用作类型 [3]int
}

数组是值类型,传递后不会被修改原数组的数据

func main() {arr := [...]int{1, 2, 3, 4, 5}NewArr := arrNewArr[0] = 100fmt.Println("arr:", arr) // arr: [1 2 3 4 5]fmt.Println("NewArr:", NewArr) //NewArr: [100 2 3 4 5]
}

对于结构等复合类型,可省略元素初始化表达式中的类型标签

type user struct {name stringage  byte
}func main() {// 结构体类型的数组,最终是由编译器判断数组长度,可以通过通过字段逐个赋值,也可以省略u := [...]user{{name: "娜可露露", age: 20}, {name: "不知火舞", age: 30}}u2 := [...]user{{"娜可露露", 20}, {"不知火舞", 30}}u3 := [2]user{{name: "哈哈", age: 99}}fmt.Println(u)  // [{娜可露露 20} {不知火舞 30}]fmt.Println(u2) //[{娜可露露 20} {不知火舞 30}]fmt.Println(u3) // [{哈哈 99} { 0}]
}

如果数组元素类型支持= =、!=操作符,那么数组也支持比较操作

func main() {var a, b [2]intfmt.Printf("a的数据类型%T\t b的数据类型%T\n", a, b) // a的数据类型[2]int        b的数据类型[2]intfmt.Println("a == b", a == b) // a == b truec := [2]int{1, 2}d := [2]int{2, 3}fmt.Println("c == d", c == d) // falsevar e ,f [2] map[string]intfmt.Println(e==f) // 无效运算: e==f (在 [2]map[string]int 中未定义运算符 ==)
}

数组内存地址是数组中第一个元素的内存地址,各个元素之间的间隔是按照数组数据类型所占用的字节决定的,比如int64占用8个字节,那么数组中的每个元素内存地址之间间隔为8,因为int类型是占8个字节,所以每个变量的内存地址依次加8,而内存地址都是16进制计算的,所以结尾都是0和8(8+8=16 逢16进就是0)

func main() {arr := [4]int{1, 2, 3, 4}fmt.Printf("arrr的地址=%p\n  arr[0]地址=%p\n  arr[1]地址%p\n  arr[2]地址%p\n  arr[3]地址%p\n", &arr, &arr[0], &arr[1], &arr[2], &arr[3])
}

输出:

arrr的地址=0x1400012e000
arr[0]地址=0x1400012e000
arr[1]地址0x1400012e008
arr[2]地址0x1400012e010
arr[3]地址0x1400012e018

索引越界异常:

现在数组有5个元素,索引是0~4,如果去取索引5的值,就会报索引越界

func main() {var arr [5]int = [5]int{1, 2, 3, 4, 5}println(arr[5]) // 无效的 数组 索引 '5' (5 元素的数组超出界限)
}
  • 出现原因:数组长度为5,索引范围是0~4,但是却访问了一个5的索引。
  • 解决方案: 将错误的索引修改为正确的索引范围即可!

数组遍历:

数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。

fori遍历

func main() {arr := [5]int{1, 2, 3, 4, 5}for i := 0; i < len(arr); i++ {fmt.Println(arr[i])}
}

range遍历

func main() {arr := [5]int{1, 2, 3, 4, 5}for i, v := range arr {fmt.Println("索引:", i, "值:", v)}for _, i := range arr {fmt.Println(i)}
}

数组作为函数参数

函数中修改数组中的值,不会影响到原数组

格式:

func 函数名 (数组){函数体}// 调用
函数名(数组)

演示:

func main() {arr := [5]int{1, 2, 3, 4, 5}Demo(arr)
}func Demo(arr [5]int) {for _, v := range arr {fmt.Println("Value:", v)}
}

不定参数数组作为函数参数

func main() {//arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}//Demo(arr)arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}Demo(arr)}func Demo(arr [...]int) {for i, v := range arr {fmt.Println("i=", i, "\t", "v=", v)}
}

数组值比较:

func main() {b := Demo()if b {fmt.Println("数据相同")} else {fmt.Println("数据不同")}
}func Demo() bool {b := truearr1 := [5]int{1, 2, 3, 4, 5}//arr2 := [5]int{1, 2, 3, 4, 5}arr2 := [5]int{6, 7, 8, 9, 10}// 先判断长度,再判断数据if len(arr1) == len(arr2) {// 长度一样就判断数据for i := 0; i < len(arr1); i++ {// 如果一样的话就跳过本次循环,继续下一个数据对比if arr1[i] == arr2[i] {continue// 数据不同则返回内容结束循环} else {b = falsebreak}}// 长度不同则返回内容结束循环} else {b = false}return b
}

数组小案例:

数组获取最大值、最小值、求和:

实现思路:

  1. 定义最大值/最小值变量,初始值为数组的0索引,数组循环的时候会依次比较,如果比最大值大/比最小值小,就赋值给最大值/最小值变量
  2. 求和:定义变量,循环相加即可
  3. 平均数不要直接除数组长度,要用len

演示:

func main() {arr := [5]int{1, 2, 3, 4, 5}// 定义最大值、最小值、求和变量max := arr[0]min := arr[0]sum := 0for i := 0; i < len(arr); i++ {// 判断数组的元素是否大于自定义的最大值,如果是就把值赋值给max,作为当前最大值if arr[i] > max {max = arr[i]// 判断数组的元素是否小于自定义的最小值,如果是就把值赋值给min,作为当前最小值} else if arr[i] < min {min = arr[i]}sum += arr[i]}fmt.Println("最大值:", max)fmt.Println("最小值:", min)fmt.Println("数组数据总和:", sum)fmt.Println("平均值:", sum/len(arr))
}
判断最长的元素
func main() {arr := [...]string{"娜可露露", "雅典娜", "韩信", "李白"}max := arr[0]for i := 0; i < len(arr); i++ {if len(arr[i]) > len(max) {max = arr[i]}}fmt.Println(max)
}

多维数组:

二维数组:

概念:

二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组

全部初始化格式:

// m:表示这个二维数组,可以存放多少个一维数组 n:表示每一个一维数组,可以存放多少个元素
var 变量名 [m] [n] int = [m] [n] int {{一维数组数据},{一维数组数据}}
变量名 := [m] [n] int {{一维数组数据},{一维数组数据}}// 简写

部分初始化格式:

// 没有被初始化的索引系统会赋上默认值
var 变量名 = [m] [n] int {{一维数组数据},{一维数组数据}}

指定初始化格式:

// 没有被初始化的索引系统会赋上默认值
var 变量名 = [m] [n] int {n{索引:数据},n{索引:数据}}

演示:

func main() {// arr是一个二维数组,里面存了2个一维数组,每个一维数组的长度是3arr := [2][3]int{{1, 2, 3}, {4, 5, 6}}arr2 := [2][3]int{{1, 2}, {4}}arr3 := [2][3]int{0: {0: 1, 1: 2, 2: 3}, 1: {0: 4, 1: 5, 2: 6}}//arr4 := [...][...]int{{1, 2, 3}, {4, 5, 6}, {1, 2, 3}, {4, 5, 6}} //  一维数组个数可以用... 但是一维数组长度不可以arr4 := [...][3]int{{1, 2, 3}, {4, 5, 6}, {1, 2, 3}, {4, 5, 6}}fmt.Println("arr:", arr, "\tarr[0]:", arr[0], "\tarr[1]:", arr[1])fmt.Println("arr2:", arr2, "\tarr2[0]:", arr2[0], "\tarr2[1]:", arr2[1])fmt.Println("arr3:", arr3, "\tarr3[0]:", arr3[0], "\tarr3[1]:", arr3[1])fmt.Println("arr4:", arr4, "\tarr4[0]:", arr4[0], "\tarr4[1]:", arr4[1])
}

输出:

arr: [[1 2 3] [4 5 6]]         arr[0]: [1 2 3]         arr[1]: [4 5 6]
arr2: [[1 2 0] [4 0 0]]        arr2[0]: [1 2 0]        arr2[1]: [4 0 0]
arr3: [[1 2 3] [4 5 6]]        arr3[0]: [1 2 3]        arr3[1]: [4 5 6]
arr4: [[1 2 3] [4 5 6] [1 2 3] [4 5 6]]        arr4[0]: [1 2 3]        arr4[1]: [4 5 6]

内置函数len和cap都返回第一纬度长度

func main() {a := [2]int{}b := [...][2]int{{10, 20}, {30, 40}, {50, 60}}println(len(a), cap(a))println(len(b), cap(b))println(len(b[1]), cap(b[1]))
}

二维数组遍历:

len(二维数组名):打印一维数组个数
len(二维数组[索引]):打印一维数组的长度

演示:

func main() {arr := [2][3]int{{1, 2}, {4, 5, 6}}fmt.Println(len(arr))    // 一维数组的个数fmt.Println(len(arr[1])) // 一维数组的长度for i := 0; i < len(arr); i++ { // 外循环是二维数组for j := 0; j < len(arr[i]); j++ { // 内循环是一维数组fmt.Print(arr[i][j])}}for i, v := range arr {fmt.Println("数组:", i, "值:", v)}for _, v := range arr {fmt.Println(v)for _, data := range v {fmt.Println(data)}}
}
三维数组:
func main() {arr := [3][3][3]int{{}}fmt.Println(arr)
}

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

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

相关文章

全局变量和环境变量的区别

全局变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值都一样.环境变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值是上次停止脚本时的值. 例子:Global 全局变量Dimenv 环境变量全局变量 全局变量 1环境变量 环境变量 …

不满足依赖关系

今晚上脑残&#xff0c;替换了实体&#xff0c;把报错的也都替换完成了&#xff0c;但是运行报错&#xff1a; 大概的意思就是说不满足XXXXXX依赖关系&#xff0c;但是找了半天都没有找到&#xff0c;最后是mapper的实体类全路径替换的时候&#xff0c;脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片&#xff1a; 切片的长度是不固定的&#xff0c;可以追加数据&#xff0c;可以理解是一个动态数组&#xff0c;切片的底层是一个结构体切片类型&#xff08;slice&#xff09;本身并不是动态数组或数组指针。它内部通过指针引用底层数组&#xff0c;设定相关属性将操作限定…

Golang——递归的使用

递归指的是函数定义中调用函数本身的现象&#xff08;自己调自己&#xff09;把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 递归注意事项&#xff1a; 递归一定要有出口。否则内存溢出(出口…

阿里巴巴Java开发手册——速读记录

本随笔基于阿里巴巴Java开发手册V1.2&#xff0c;陆陆续续记录一些现阶段能理解的&#xff0c;有启发的内容&#xff0c;并将持续更新 最佳实践——插件使用已经发布为随笔&#xff01;http://www.cnblogs.com/jiangbei/p/7668654.html 一、编程规范 1.命名规范 &#xff08;1&…

Go_map集合初始化、键值操作、map作为函数参数的使用

map&#xff1a; map是key-value的数据结构&#xff0c;类似于Java的集合&#xff0c;又称为字典&#xff0c;像新华字典就是key:value类型展示的map是无序的&#xff0c;其中key是不允许重复的&#xff0c;key不存在相当于添加&#xff0c;存在相当于修改map的key必须可以进行…

Angular 小试牛刀[1]:Getting Started

首先&#xff0c;Angular2 与 Angular1.x 版本没有多大关系&#xff0c;甚至可以说是两个完全不一样的框架&#xff0c;故 Angular 指的是 Angular2 及以上的版本。而 Angular 与 TypeScript 的完美结合&#xff0c;对于一个 .NET 开发者来说&#xff0c;实在是找不到不用它的理…

Go_指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

指针&#xff1a; 指针是一个特殊的变量&#xff0c;因为它存储的数据是另一个变量的内存地址&#xff0c;指针本身也是有内存地址的指针的数据类型有int、float、bool、string、数组、结构体指针的作用就是可以通过变量/对象的内存地址去操作变量/对象 注意&#xff1a; 取址运…

linux驱动编写(Kconfig文件和Makefile文件)

在Linux编写驱动的过程中&#xff0c;有两个文件是我们必须要了解和知晓的。这其中&#xff0c;一个是Kconfig文件&#xff0c;另外一个是Makefile文件。如果大家比较熟悉的话&#xff0c;那么肯定对内核编译需要的.config文件不陌生&#xff0c;在.config文件中&#xff0c;我…

Go_结构体与数组、切片、map、方法、作为函数参数、type、Tag

结构体&#xff1a; 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体可以很好的管理数据&#xff0c;使用结构体可以提高程序的易读性&#xff0c;类似于Java的类一样结构体内成员名必须唯一&#xff0c;可用_补位&#xff0c;支持使用自身类型的指针成员。…

vue项目中如何引入ElementUI

1.在cmd中输入命令&#xff1a; npm i element-ui -S 2.在src/main.js文件中增加代码&#xff1a; import ElementUI from element-ui import element-ui/lib/theme-default/index.cssVue.use(ElementUI) 转载于:https://www.cnblogs.com/xuemei/p/7372332.html

Golang——深浅拷贝

浅拷贝&#xff1a;只是拷贝了内存地址&#xff0c;会指向原来的内存&#xff0c;指向原来的内存地址&#xff0c;操作的时候会互相影响 go中的赋值、函数传参、函数返回值都是浅拷贝 深拷贝&#xff1a;会把变量的数据都拷贝一份&#xff0c;包括地址&#xff0c;新的内存地址…

[Java][web]利用Spring随时随地获得Request和Session

利用Spring随时随地获得Request和Session 一、准备工作&#xff1a; 在web.xml中加入 <listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener>二、用法&#xff1a;…

Golang实现通讯录小案例

代码&#xff1a; package mainimport "fmt"func main() {for {menu()} }type User struct {userName string/**key&#xff1a;表示电话的类型value&#xff1a;电话号码*/addressPhone map[string]string }// 定义切片 var userList make([]User, 0)func menu() …

MySql5.6版修改用户登录密码

1、使用 mysqladmin 方式: 打开命令提示符界面, 执行命令: mysqladmin -u root -p password 新密码 执行后提示输入旧密码完成密码修改, 当旧密码为空时直接按回车键确认即可。 2、UPDATE user 语句&#xff08;我自己用的就是这个方法&#xff09; 这种方式必须是先用root帐户…

Go_面向对象(抽象、封装、继承)

抽象 抽象是一种编程思维方式&#xff0c;是从多个事物中提取共性 例&#xff1a;产品经理和程序员都有工作的方法&#xff0c;但是工作内容不同&#xff0c;可以把工作抽象出来定义为一个方法&#xff0c;具体细节由调用者补充 银行存取款案例&#xff1a; 账号结构体取款方法…

Go_接口、多态、接口继承与转换、空接口、类型断言

接口 接口用于定义对象的行为&#xff0c;接口只指定对象应该做什么&#xff0c;实现这种行为由对象来决定。接口只是把所有具有共性的方法定义在一起&#xff0c;任何类型实现了接口中所有的方法&#xff0c;就是实现了这个接口。接口存在的意义就是用来定义规范&#xff0c;…

Discrete Logging POJ - 2417(BSGS)

Discrete Logging POJ - 2417 题意&#xff1a;给P&#xff0c;B&#xff0c;N&#xff0c;求最小的L使得 BL≡N (mod P)&#xff0c;其中P是素数。 Baby Step Giant Step 1 #include <cstdio>2 #include <cstring>3 #include <iostream>4 #include <cma…

Go_error处理及panic、recover使用的正确姿势

异常 异常就是程序出现了不正常的情况&#xff0c;会导致程序非正常停止&#xff0c;而异常处理就是针对非正常停止的情况&#xff0c;给出异常时的处理方式。语法错误不算异常体系中 error&#xff1a; error是一个接口&#xff0c;作用是返回程序异常的信息&#xff0c;err…

js 根据固定位置获取经纬度--腾讯地图

1.首先引入jq 和 腾讯地图js <script src"../js/jQuery.js"></script> <script charset"utf-8" src"http://map.qq.com/api/js?v2.exp"></script> 2.html代码部分 <body onload"init()"><button ty…