package main
import(
"fmt"
"math/rand"
"time"
)
func main() {
//数组的几种定义方式
var arr1 [3]int = [3]int{1,2,3}
var arr2 = [3]int{4,5,6}
arr3 := [3]string{"h", "w", "z"}
var arr4 = [...]int{1,2,3} //[...]固定写法
var arr5 = [...]string{1:"zhangsan", 0:"lisi", 2:"wangwu"} //可以指定数组下标
fmt.Printf("arr1 = %v, type %T\n", arr1, arr1)
fmt.Printf("arr2 = %v, arr2[0]的地址%p\n", arr2, &arr2[0])
fmt.Printf("arr3 = %v, arr3 %p, arr3[2]的地址%p\n", arr3, &arr3, &arr3[2])
//for遍历数组
for i := 0; i < len(arr4); i++ {
fmt.Printf("arr 第%v个元素的值%v\n", i, arr4[i])
}
fmt.Println(arr5)
//for range 遍历
//for _,v := range arr 这样只关心 v值; 不关心i下标
for i,v := range arr5 {
fmt.Printf("i = %v, v = %v\n", i, v)
}
//细节
var testArr [3]int //一旦定义了数组类型以及长度;以后就是不能动态改变
testArr[0] = 1
testArr[1] = 2
//testArr[3] = 2.1 //此时要报错 类型不正确
//testArr[4] = 4 //越界也不行
fmt.Println(testArr)
//默认值 数字(整型,浮点)是0,string 是空字符串,bool 是false
var testIntArr [3]float32
var testStrArr [3]string
var testBoolArr [3]bool
//intarr = [0 0 0], strArr = [ ], boolArr = [false false false]
fmt.Printf("intarr = %v, strArr = %v, boolArr = %v\n", testIntArr, testStrArr, testBoolArr)
//数组是值传递
tv := [3]int{1,2,3}
testValArr(tv)
//1,2,3 没有改变
fmt.Println(tv)
//可以通过指针来引用传递
testPointArr(&tv)
//此时就改变了tv的值了 11,2,3
fmt.Println(tv)
//数组长度也是数组类型的一部分,如果长度不等相当于不一样的类型
//tv2 := [2]int{1,2}
//testValArr(tv2) //此时是要报错的因为函数接收3个长度的
//tv3 := [...]int{1,2,3,4} //这个也是通过不了
//testValArr(tv3)
//tv4 := [...]int{1,3,4} //这个是通过的
//testValArr(tv4)
//输出A-Z
var myByte [26]byte
for i := 0; i < 26; i++ {
myByte[i] = 'A' + byte(i)//需要把i转成byte类型
}
for i := 0; i < 26; i++ {
fmt.Printf("%c ", myByte[i])
}
//求数组最大值
var maxArr [7]int = [7]int{1,3,60,-2,80,50,2}
//假设数组第一个值为最大值,然后循环去比较
maxIndex := 0
maxVal := maxArr[0]
for i,v := range maxArr {
if maxVal < v {
maxVal = v
maxIndex = i
}
}
fmt.Printf("\nmaxVal = %v, maxIndex = %v\n", maxVal, maxIndex)
//求数组的平均值
avgArr := [7]int{1,2,3,20,55,11,22}
sum := 0
for _,val := range avgArr {
sum += val
}
fmt.Printf("avgArr的平均值为= %0.2f\n", float64(sum) / float64(len(avgArr)))
//随机5个数,以及反转数组
var reverArr [5]int
//需要一个随机种子;要不每次随机值都一样
rand.Seed(time.Now().UnixNano()) //使用纳秒
reverArrLen := len(reverArr);
for i := 0; i < reverArrLen; i++ {
reverArr[i] = rand.Intn(100) // 0<=n<100
}
fmt.Println(reverArr);
//反转思路, 第一个和最后一个交换, 第二个和倒数第二个交换,就可以确认需要交换 len(arr)/2次;值可以通过中间变量来解决
tmp := 0 //中间临时变量
for i := 0; i < reverArrLen / 2; i++ {
tmp = reverArr[reverArrLen - 1 - i] //存放后面的一个值
reverArr[reverArrLen - 1 - i] = reverArr[i] //把后面一个值赋值为前面的值
reverArr[i] = tmp //前面的值赋值为后面的值
}
fmt.Println(reverArr);
}
func testPointArr(arr *[3]int) {
(*arr)[0] = 11 //(*arr)取指针的值
}
func testValArr(arr [3]int) {
arr[0] = 11
}
二维数组
package main
import(
"fmt"
)
func main() {
var arr [3][5]float64 //定义一个二维数组
for i := 0; i < len(arr); i++ {
for j := 0; j < len(arr[i]); j++ {
fmt.Printf("请输入第%v个班级第%v学生的成绩\n", i+1, j+1)
fmt.Scanln(&arr[i][j]);
}
}
//遍历二维数组
for i,v := range arr {
var sum float64 = 0
for _,val := range v {
sum += val
}
fmt.Printf("第%v个班级的平均成绩%v\n", i+1, sum / float64(len(arr[i])))
}
}