一、简介
数组可以存放多个同一类型数据,数组也是一种数据类型,数值是值类型。
二、数组定义
数组求和求平均
package main
import (
"fmt"
)
func main() {
//定义一个数组,4个元素
var hens [4]float64;
//给数组的每个元素赋值
hens[0] = 1.1
hens[1] = 22.2
hens[2] = 2.5
hens[3] = 5.4
//遍历数组求总体重
Weight := 0.0
for i :=0; i < len(hens);i++{
Weight += hens[i]
}
Averageweight := fmt.Sprintf("%.2f", Weight / 6)
fmt.Printf("总体重%.2f,平均体重%v", Weight, Averageweight)
}
输出
PS D:\goproject\src\go_code\chaptor7_array\demo01> go run .\main.go
总体重31.20,平均体重5.20
内存布局
数组的地址可以通过数组名获取,&intArr
数组的第一个元素的地址,就是数组的首地址
数组的各个元素的地址间隔是依据数组的类型决定,比如int64->8,int32->4
package main
import (
"fmt"
)
func main() {
var intArr [3]int
fmt.Println(intArr) //默认是0
fmt.Printf("intArr的地址=%p, 第一个元素的地址=%p", &intArr, &intArr[0]) //数组的地址和第一个元素的地址一样
}
输出
PS D:\goproject\src\go_code\chaptor7_array\demo2> go run .\main.go
[0 0 0]
intArr的地址=0xc000016198, 第一个元素的地址=0xc000016198
三、数组的几种初始化方式
var score1 [3]int = [3]int {1, 2, 3}
var score2 = [3]int {1, 2, 3}
var score3 = [...]int {1, 2, 3}
var names = [3]string{1:"TOM", 0:"JACK", 2:"MARRY"} //指定元素值对应的下标
四、for-range遍历for index, value := range ayyay01 {}
1、第一个返回值index是数组得下标;
2、第二个value是改下标的值;
3、他们都是仅在for循环内部可见的局部变量;
4、遍历数组元素的时候,如果不想使用下标index,可以使用_;
5、index和value的名称不是固定的。
package main
import (
"fmt"
)
func main() {
var heroes [3]string = [...]string{"宋江", "武松", "鲁智深"}
for i, v := range heroes {
fmt.Printf("i=%v, v=%v\n", i, v)
}
for _, v := range heroes { //不需要index
fmt.Printf("v=%v\n", v)
}
}
输出
PS D:\goproject\src\go_code\chaptor7_array\demo4> go run .\main.go
i=0, v=宋江
i=1, v=武松
i=2, v=鲁智深
v=宋江
v=武松
v=鲁智深
五、数组的使用
从终端循环输入5个成绩,保存到float数组,并输出
package main
import (
"fmt"
)
func main() {
var score [5]float64
for i := 0; i < len(score); i++ {
fmt.Printf("输入第%d个元素的值\n", i+1)
fmt.Scanln(&score[i])
}
for i := 0; i < len(score); i++ {
fmt.Printf("score[%d]=%v", i, score[i])
}
}
输出
PS D:\goproject\src\go_code\chaptor7_array\demo3> go run .\main.go
输入第1个元素的值
5.2
输入第2个元素的值
4.2
输入第3个元素的值
85.21
输入第4个元素的值
4.1
输入第5个元素的值
5.0
score[0]=5.2score[1]=4.2score[2]=85.21score[3]=4.1score[4]=5
循环输出26个大写字母
package main
import (
"fmt"
)
func main() {
var myChars [26]byte
for i:= 0; i < 26; i++ {
myChars[i] = 'A' + byte(i) //int转byte
fmt.Printf("%c ", myChars[i])
}
}
输出
PS D:\goproject\src\go_code\chaptor7_array\arrexercise01> 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
求数组最大值
package main
import (
"fmt"
)
func main() {
var intArr [5]int = [...]int {1, 5, -8, 6, 4}
maxVal := intArr[0]
maxValIndex := 0
for i := 1; i < len(intArr); i++ {
if maxVal < intArr[i] {
maxVal = intArr[i]
maxValIndex = i
}
}
fmt.Printf("最大值是%v,最大值下标为%v", maxVal, maxValIndex)
}
输出
PS D:\goproject\src\go_code\chaptor7_array\arrexercise01> go run .\main.go
最大值是6,最大值下标为3
求数组的和、平均值
package main
import (
"fmt"
)
func main() {
var intArr [5]int = [...]int {1, 5, -8, 6, 4}
sum := 0
for _, v := range intArr {
sum += v
}
//平均值取小数
fmt.Printf("sum=%v,avg=%v", sum, float64(sum) / float64(len(intArr)) )
}
输出
PS D:\goproject\src\go_code\chaptor7_array\arrexercise01> go run .\main.go
sum=8,avg=1.6
六、数组反转
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//随机生成五个数,rand.Intn()
var intArr [5]int
//为了每次生成的随机数不一样,我们需要给一个seed值
rand.Seed(time.Now().Unix())
for i := 0; i < 5; i++ {
intArr[i] = rand.Intn(100) //0<=n<100的数
}
fmt.Println(intArr)
tmp := 0 //临时变量
for j := 0; j < len(intArr)/2; j++ {
tmp = intArr[len(intArr) -1 -j]
intArr[len(intArr) -1 -j] = intArr[j]
intArr[j] = tmp
}
fmt.Println(intArr)
}
输出
PS D:\goproject\src\go_code\chaptor7_array\arrexercise02> go run .\main.go
[39 34 78 56 43]
[43 56 78 34 39]