不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

    • 01.GO介绍与安装
    • 02.GO基本语法
    • 03.内置运算符
    • 04.基本数据类型
    • 05.数字类型
    • 06.字符串类型
    • 07.数组
      • 01.数组介绍
        • 1.1 Array介绍
        • 1.2 数组定义
        • 1.3 数组是值类型
      • 02.创建数组
        • 2.1 自定义数组长度
        • 2.2 让编译器识别
        • 2.3 指定索引值
      • 03.数组的遍历
        • 3.1 普通遍历数组
        • 3.2 k,v遍历数组
      • 04.多维数组
        • 4.1 定义多维数组
        • 4.2 遍历多维数组
      • 05.数组练习
        • 5.1 数组求和
        • 5.2 数组最大值
    • 08.切片
    • 09.map
    • 10.指针
    • 11.结构体
    • 12.interface接口
    • 13.循环
    • 14.包管理工具go mod
    • 15.单元测试
    • 16.go规范
  • 面向对象

  • 并发编程

  • 常用库

  • 数据库操作

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • GO基础
xiaonaiqiang
2021-05-19
目录

07.数组

# 01.数组介绍

# 1.1 Array介绍

  • 数组是指一系列同一类型数据的集合。
  • 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等
  • 一个数组包含的元素个数被称为数组的长度。
  • 在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。
  • Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。
  • 和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活
  • 但是想要理解 slice 工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

# 1.2 数组定义

var 数组变量名 [元素数量]T
1
  • 比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分
  • 一旦定义,长度不能变。 [5]int 和[4]int 是不同的类型。
package main
import "fmt"
func main() {
	// 定义一个长度为 3 元素类型为 int 的数组 a
	var a [5]int
	// 定义一个长度为 3 元素类型为 int 的数组 b 并赋值
	var b [3]int
	b[0] = 80
	b[1] = 100
	b[2] = 96
	fmt.Println(a)     // [0 0 0 0 0]
	fmt.Print(b)     // [80 100 96]
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 1.3 数组是值类型

  • 数组是值类型,赋值和传参会复制整个数组。

  • 因此改变副本的值,不会改变本身的值。

  • 注意:

    • 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
    • [n]*T表示指针数组,*[n]T 表示数组指针
package main
import "fmt"
func main() {
	a := [3]int{10, 20, 30}
	modifyArray(a)    //在 modify 中修改的是 a 的副本 x
	fmt.Println(a)     //[10 20 30]
}
func modifyArray(x [3]int) {
	x[0] = 100
}
1
2
3
4
5
6
7
8
9
10

# 02.创建数组

# 2.1 自定义数组长度

package main
import "fmt"
func main() {
	// 1) 数组会初始化为 int 类型的零值
	var testArray [3]int    
	fmt.Println(testArray)    //[0 0 0]
	
	// 2) 使用指定的初始值完成初始化
	var numArray = [3]int{1, 2} 
	fmt.Println(numArray)     //[1 2 0]
	
	var cityArray = [3]string{"北京", "上海", "深圳"}
	fmt.Println(cityArray)    //[北京 上海 深圳]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2.2 让编译器识别

  • 按照上面的方法每次都要确保提供的初始值和数组长度一致
  • 一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度
package main
import "fmt"
func main() {
	var numArray = [...]int{1, 2}
	fmt.Println(numArray)   //[1 2]
	fmt.Printf("type of numArray:%T\n", numArray)  //type of numArray:[2]int

	var cityArray = [...]string{"北京", "上海", "深圳"}
	fmt.Println(cityArray)   //[北京 上海 深圳]
	fmt.Printf("type of cityArray:%T\n", cityArray)  //type of cityArray:[3]string
}
1
2
3
4
5
6
7
8
9
10
11

# 2.3 指定索引值

  • 我们还可以使用指定索引值的方式来初始化数组
package main
import "fmt"
func main() {
	// 初始化一个整数数组,在下标1号和3号位置写入: 1   5
	a := [...]int{1: 1, 3: 5}
	fmt.Println(a)    // [0 1 0 5]
	fmt.Printf("type of a:%T\n", a)    //type of a:[4]int
}
1
2
3
4
5
6
7
8

# 03.数组的遍历

# 3.1 普通遍历数组

package main
import "fmt"
func main() {
	var a = [...]string{"北京", "上海", "深圳"}
	for i := 0; i < len(a); i++ {
		fmt.Println(a[i])
	}
}
/*
北京
上海
深圳
 */
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3.2 k,v遍历数组

package main
import "fmt"
func main() {
	var a = [...]string{"北京", "上海", "深圳"}
	for index, value := range a {
		fmt.Println(index, value)
	}
}
/*
0 北京
1 上海
2 深圳
 */
1
2
3
4
5
6
7
8
9
10
11
12
13

# 04.多维数组

# 4.1 定义多维数组

package main
import "fmt"
func main() {
	a := [3][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	fmt.Println(a)         //[[北京 上海] [广州 深圳] [成都 重庆]]
	fmt.Println(a[2][1])     //支持索引取值:重庆
}
1
2
3
4
5
6
7
8
9
10
11

# 4.2 遍历多维数组

package main
import "fmt"
func main() {
	a := [3][2]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	for _, v1 := range a {   // v1 = [北京 上海]
		for _, v2 := range v1 {
			fmt.Println(v2)
		}
	}
}
/*
北京
上海
广州
深圳
成都
重庆
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 05.数组练习

# 5.1 数组求和

package main
import "fmt"
func main() {
	var intArr2 [5]int = [...]int {1, -1, 9, 90, 12}
	sum := 0
	for _, val := range intArr2 {
		//累计求和
		sum += val
	}
    
	//如何让平均值保留到小数.
	fmt.Printf("sum=%v 平均值=%v \n\n", sum, float64(sum) / float64(len(intArr2)))
	// sum=111 平均值=22.2 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 5.2 数组最大值

  • 1、声明一个数组 var intArr[5] = [...]int {1, -1, 12, 65, 11}

  • 2、假定第一个元素就是最大值,下标就 0

  • 3、然后从第二个元素开始循环比较,如果发现有更大,则交换

package main
import "fmt"
func main() {
	var intArr = [...]int{1, -1, 112, 65, 11}
	maxValue := intArr[0]
	maxIndex := 0
	for i := 0; i < len(intArr); i++ {
		if maxValue < intArr[i] {
			maxValue = intArr[i]
			maxIndex = i
		}
	}
	fmt.Println("最大值", maxValue, "最大值索引值", maxIndex)
	// 最大值 112 最大值索引值 2
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上次更新: 2024/3/13 15:35:10
06.字符串类型
08.切片

← 06.字符串类型 08.切片→

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式