教程 > Go 教程 > Go 基础 阅读:299

Go 将数组作为参数传递给函数

如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组。可以使用以下两种方式中的任一种声明函数形参,并且两种声明方法都会产生相似的结果,因为每种方法都告诉编译器一个整数数组正在被接收。类似的方式我们可以将多维数组作为形式参数传递。

Go 中的数组是值类型而不是引用类型。这意味着当它们被分配给一个新变量时,原始数组的副本被分配给新变量。如果对新变量进行了更改,它将不会反映在原始数组中。

方式一

形参设定数组大小:

void myFunction(param [10]int)
{
.
.
.
}

方式二

形参未设定数组大小:

void myFunction(param []int)
{
.
.
.
}

示例

让我们看下以下示例,函数接收整型数组参数,另一个参数指定了数组元素的个数,并返回平均值:

func getAverage(arr []int, size int) float32
{
   var i int
   var avg, sum float32  

   for i = 0; i < size; ++i {
      sum += arr[i]
   }

   avg = sum / size

   return avg;
}

接下来我们来调用这个函数:

package main

import "fmt"

func main() {
   /* 数组长度为 5 */
   var  balance = [5]int {1000, 2, 3, 17, 50}
   var avg float32

   /* 数组作为参数传递给函数 */
   avg = getAverage( balance, 5 ) ;

   /* 输出返回的平均值 */
   fmt.Printf( "平均值为: %f ", avg );
}
func getAverage(arr [5]int, size int) float32 {
   var i,sum int
   var avg float32  

   for i = 0; i < size;i++ {
      sum += arr[i]
   }

   avg = float32(sum) / float32(size)

   return avg;
}

运行示例

上述代码编译执行结果如下:

平均值为: 214.399994

如上所示,数组的长度对函数而言并不重要,因为 Go 不执行形式参数的边界检查。

本章上面我们说过Go 中的数组是值类型而不是引用类型。因此函数中的参数也是一种值传递,所以函数内对数组参数做的任何的修改,都不会影响原来的数组

package main

import "fmt"

func changeLocal(num [5]int) {  
    num[0] = 55
    fmt.Println("inside function ", num)

}
func main() {  
    num := [...]int{5, 6, 7, 8, 8}
    fmt.Println("before passing to function ", num)
    changeLocal(num)
    fmt.Println("after passing to function ", num)
}

运行示例

在上面的程序中,数组num实际上是按值传递给函数changeLocal的,因此不会因为函数调用而改变。该程序编译执行结果如下:

before passing to function  [5 6 7 8 8]  
inside function  [55 6 7 8 8]  
after passing to function  [5 6 7 8 8] 

查看笔记

扫码一下
查看教程更方便