Golang与数组

mac2026-06-19  2

文章目录

1. 数组概述2. 数组声明3. 数组初始化4. 数组遍历5. 数组使用说明

1. 数组概述

Go语言中 字符串 数组 切片 这三种数据类型在底层原始数据有着相同的内存结构,在上层因为语法的限制而有着不同的行为表象.

数组是用来存放同一类型数据的并且具有固定长度的连续内存区域,使用时可以修改数组成员,但是不能改变数组的长度.数组是一种数据类型,在Go语言是中数组是值类型.

数组的长度是固定的数组中的元素类型一定是一致的数组长度是数组类型的组成部分,故不同长度和元素类型的数组是不同的类型理解数组是理解切片的基础Go语言中数组是值语义,一个数组变量表示整个数组

当需要详细规划程序所使用的内存时,数组类型非常有用, 使用数组值可以避免耗时费力的内存二次分配操作

package main import "fmt" func main() { var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} L := len(week) for i := 0; i < L; i++ { // 观察输出的各个数组元素的内存地址 fmt.Println(&week[i]) } } $ go run main.go 0xc000084000 0xc000084010 0xc000084020 0xc000084030 0xc000084040 0xc000084050 0xc000084060 0xc000084070

2. 数组声明

数组的声明写法如下 :

var 数组名 [数组长度]T

数组名 : 就是数组在使用的时候的变量名数组长度 : 数组定义时,最多允许的存入数组的元素的数量,可以是一个表达式,在程序编译期计算的结果必须是一个整数,在使用前这个值是已经确定的T : 表示一种数据类型, 数组的类型可以是数组,这样就构成了多维数组长度为0的数组在内存中不占用空间 package main import "fmt" const N = 2 func main() { var nArr [3]int var sArr [7]string var fArr [10]float64 var hArr [5][1]string var ageArr [N * 5]int fmt.Println(nArr) fmt.Println(sArr) fmt.Println(fArr) fmt.Println(hArr) fmt.Println(ageArr) } $ go run main.go [0 0 0] [ ] [0 0 0 0 0 0 0 0 0 0] [[] [] [] [] []] [0 0 0 0 0 0 0 0 0 0]

3. 数组初始化

数组初始化就是给数组填充一些数据

方式1:

数组在声明是使用初始化列表进行元素设置

这种数组初始化,列表元素的个数可以比数组长度少,但是不能超过数组长度

package main import "fmt" func main() { var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} fmt.Println(week) }

方式2:

在编译器编译的时候,由编译器根据数组元素个数自动设置数长度

[...] 方括号中的 ... 表示有Go编译器计算该值的元素数量并以此获取其长度

package main import "fmt" func main() { var workDay = [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"} fmt.Println(workDay) var nArr = [...]int{0:9,15:900} fmt.Println(nArr) } $ go run main.go [Monday Tuesday Wednesday Thursday Friday] [9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 900]

方式3:

一般方法, 先声明,后定义

package main import "fmt" func main() { var NS [3][1]string NS[0][0] = "aa" NS[1][0] = "bb" NS[2][0] = "cc" fmt.Println(NS) }

4. 数组遍历

通常数组遍历就是访问数组中的每一个元素

方法一 for 循环遍历

package main import "fmt" func main() { var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} L := len(week) for i:=0; i<L;i++ { fmt.Println(i,"----",week[i]) } } $ go run main.go 0 ---- _ 1 ---- Monday 2 ---- Tuesday 3 ---- Wednesday 4 ---- Thursday 5 ---- Friday 6 ---- Saturday 7 ---- Sunday

方法二 for range 结构遍历

package main import ( "fmt" ) func main() { var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} // k 表示数组下标 , v表示元素值 for k,v := range week{ fmt.Println(k,"===",v) } } $ go run main.go 0 === _ 1 === Monday 2 === Tuesday 3 === Wednesday 4 === Thursday 5 === Friday 6 === Saturday 7 === Sunday

5. 数组使用说明

数组声明之后,没有初始化数组中的元素的值都是默认值数组长度不能动态变化数组的下标都是从0开始的数组下标使用不能超过数组的长度否则数组越界,程序报错数组属于值类型,默认是值传递,拷贝的副本,值修改相互不影响在不同的函数之间,想修改原数组,可以使用引用传递 package main import "fmt" func modify(arr [8]string){ arr[0] = "DEMO" fmt.Println(arr) } func main(){ var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} modify(week) fmt.Println(week) } $go run main.go [DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday] [_ Monday Tuesday Wednesday Thursday Friday Saturday Sunday]

引用传递

package main import ( "fmt" ) func modify(arr [8]string){ arr[0] = "DEMO" fmt.Println(arr) } func modifyCite(arr *[8]string){ arr[1] = "星期一" } func main(){ var week = [8]string{"_", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} modify(week) // 引用传递 modifyCite(&week) fmt.Println(week) } $ go run main.go [DEMO Monday Tuesday Wednesday Thursday Friday Saturday Sunday] [_ 星期一 Tuesday Wednesday Thursday Friday Saturday Sunday]

练习Demo

package main import ( "fmt" ) func main() { // 打印26字母 var char [26]byte for i := 0; i < 26; i++ { char[i] = 'A' + byte(i) } for _, v := range char { fmt.Printf("%c\t", v) } //求一个数组中的最大值 var n = [...]int{1, 9, -90, 88, 99, 8776, 23} maxIndex := 0 maxValue := n[maxIndex] for k, v := range n { if v > maxValue { maxValue = v maxIndex = k } } fmt.Printf("\n数组n中最大值是%d,其下标是%d", maxValue, maxIndex) // 求出数组的平均值 数组元素值总和/ 元素个数 L := len(n) sum := 0 for i := 0; i < L; i++ { sum += n[i] } aver := float64(sum / L) fmt.Printf("\n数组n有%d个元素,平均值是%f", L, aver) } $ go run main.go A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 数组n中最大值是8776,其下标是5 数组n有7个元素,平均值是1272.000000
最新回复(0)