一、数组
一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。请问这六只鸡的总体重是多少?平均体重是多少?
传统方法解决:
package main
import (
"fmt"
)
func main(){
//传统方法解决
a1,a2,a3,a4,a5,a6 := 3.0,5.0,1.0,3.4,2.0,50.0
weight := a1 + a2 + a3 + a4 + a5 + a6
mean := fmt.Sprintf("%.2f",weight / 6)
fmt.Printf("总重量为%v,平均重量为%v",weight,mean)
}
使用数组解决:
package main
import (
"fmt"
)
func main(){
var num [6]float64
num[0] = 3.0
num[1] = 5.0
num[2] = 1.0
num[3] = 3.4
num[4] = 2.0
num[5] = 50.0
//定义一个变量
var total float64
for i := 0; i < len(num); i++ {
total += num[i]
}
conut := fmt.Sprintf("%.2f",total / float64(len(num)))
fmt.Printf("总重量为%v,平均重量为%v",total,conut)
}
二、数组内存图
三、数组使用
从终端循环输入5个成绩,保存到int数组,并输出
package main
import (
"fmt"
)
func main(){
var conut [5]int
for i := 0; i < len(conut); i++ {
fmt.Printf("请输入第%d个元素的值\n",i+1)
fmt.Scanln(&conut[i])
}
for i := 0; i < len(conut); i++ {
fmt.Printf("conut[%d]=%v\n",i,conut[i])
}
}
四、不同初始化数组的方式
package main
import (
"fmt"
)
func main(){
//第一种
var num1 [2]int
num1[0] = 1
num1[1] = 2
fmt.Println(num1)
//第二种
var num2 [2]int = [2]int{3,4}
fmt.Println(num2)
//第三种
var num3 = [2]int{5,6}
fmt.Println(num3)
//第四种
var num4 = [...]int{7,8,9,10}
fmt.Println(num4)
//第五种
var num5 = [2]int{1:9,0:8}
fmt.Println(num5)
//第六种
num6 := [2]int{3,2}
fmt.Println(num6)
//第七种,切片类型
num7 := []int{1,2,3,4,5,6}
fmt.Println(num7)
}
五、遍历数组的两种方式
package main
import (
"fmt"
)
func main(){
//第一种使用for循环遍历
var num = [2]int{1,2}
for i:=0; i<len(num); i++ {
fmt.Println(num[i])
}
//第二种使用for-range
var num1 = [2]int{3,4}
for i,v := range num1 {
fmt.Printf("i=%v v=%v\t",i,v)
}
}
六、数组的注意事项
1、数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
package main
import (
"fmt"
)
func main(){
var a1 [2]int
a1[0] = 1
//a1[1] = 2.1 //constant 2.1 truncated to integer,数据类型不一样
a1[1] = 2
//a1[2] = 3 //invalid array index 2 (out of bounds for 2-element array),数组长度越界
fmt.Println(a1)
}
2、var arr []int这时arr就是一个slice切片。
package main
import (
"fmt"
)
func main(){
var a1 []int = []int{1,2,3}
fmt.Printf("%T",a1)
}
3、数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用(参考案例一)。
4、数组创建后,如果没有赋值,有默认值
package main
import (
"fmt"
)
func main(){
var a1 [1]int
var a2 [1]string
var a3 [1]bool
fmt.Printf("%v,%v,%v",a1,a2,a3)
}
5、使用数组的步骤1.声明数组并开辟空间 2给数组各个元素赋值 3使用数组
6、数组的下标是从0开始的。
package main
import (
"fmt"
)
func main(){
var a1 [1]int = [1]int{1}
for i,v := range a1 {
fmt.Println(i,v)
}
}
7、数组下标必须在指定范围内使用,否则报panic:数组越界(参考案例一)
8、Go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响。
package main
import (
"fmt"
)
//定义一个数组类型的函数
func test(arr [3]int) {
arr[0] = 4
}
func main(){
arr := [3]int{1,2,3}
test(arr)
fmt.Println(arr)
}
9、如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)
package main
import (
"fmt"
)
//定义一个数组类型的函数
func test(arr *[3]int) {
(*arr)[0] = 4
}
func main(){
arr := [3]int{1,2,3}
test(&arr)
fmt.Println(arr)
}
10、长度是数组类型的一部分,在传递函数参数时需要考虑数组的长度(参考案例九)。
七、数组练习一
创建一个byte类型的26个元素的数组,分别放置'A-Z。使用for循环访问所有元素并打印出来。提示:字符数据运算'A'+1-> 'B'。
package main
import (
"fmt"
)
func main(){
//定义一个数组
var arr [26]byte
for i := 0; i < 26; i++ {
arr[i] = 'A' + byte(i)
fmt.Printf("%c\t",arr[i])
}
}
练习二
请求出一个数组的最大值,并得到对应的下标
package main
import (
"fmt"
)
func main(){
arr := [...]int{1,8,9,10,2,4}
max := arr[0]
maxval := 0
for i := 1; i < len(arr); i++ {
if max < arr[i] {
max = arr[i]
maxval = i
}
}
fmt.Printf("最大数为:%v,索引下标为:%v",max,maxval)
}
练习三
请求出一个数组的和和平均值。for-range
package main
import (
"fmt"
)
func main(){
arr := [...]int{1,8,9,10,2,4}
sum := 0
average := 0.0
for _, val := range arr {
//求和
sum += val
//求平均值
average = float64(sum) / float64(len(arr))
}
fmt.Printf("和为:%v,平均值为:%v",sum,average)
}
练习四
随机生成五个数,并将其反转打印
package main
import (
"fmt"
"math/rand"
"time"
)
func main(){
//打印随机生成五个数
var arr [5]int
var num int
len := len(arr)
rand.Seed(time.Now().UnixNano())
for i := 0; i < len; i++ {
arr[i] = rand.Intn(100)
}
fmt.Println("反转前",arr)
//反转打印
for i := 0; i < len / 2; i++ {
num = arr[len - 1 - i]
arr[len - 1 - i] = arr[i]
arr[i] = num
}
fmt.Println("反转后",arr)
}