GO学习 --- 数组使用与注意事项

这篇博客详细介绍了Go语言中数组的概念和操作,包括如何声明、初始化、遍历和计算数组的总和与平均值。通过示例代码展示了传统方法与使用数组的不同解题方式,以及数组在内存中的表示。同时,强调了数组长度固定、元素类型一致、默认值等特性,并给出了在函数中传递数组时值传递与指针传递的区别。最后,提供了几个练习题供读者实践,如创建字母数组、找出数组最大值及其下标、计算数组和与平均值以及数组反转等。
摘要由CSDN通过智能技术生成

一、数组

一个养鸡场有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)
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭鸭老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值