Go 的奇妙旅程:Go 向函数中传参数组/数组切片|Go 主题月

函数是应用程序开发中极度常见的组成部分,而不少的我们往往需要向函数传递数组作为参数,以对数据进行处理。常见的应用领域为:

  1. 排序
  2. 展示列表
  3. 数据分析

如果要将一维数组作为函数的参数传递,则我们必须以下面两种方式之一声明函数形式参数(两种声明方法都会产生相似的结果)。我们也可以类似的方式将多维数组作为形式参数传递。

不过以下方法有着本质区别:

[]int[5]int 这两种表达方式在 Go 语言里有根本性的区别。[]int 不是数组,而是数组切片(slice),而 [5]int 是一个数组。在 Go 语言中,数组是值类型,而数组切片是引用类型。

值类型变量在函数调用时的参数传递中会被完整拷贝一次变量内容,之后函数内操作的只是这个拷贝的副本。一般而言,参数类型会选择数组切片而非数组,以避免拷贝所导致的性能损耗。

方法一 —— 数组

形参为固定尺寸的数组,如下:

void myFunction(param [10]int) {
    // ……
}
复制代码

方法二 —— 数组切片

形参为非固定尺寸的的数组切片,如下:

void myFunction(param []int) {
    // ……
}
复制代码

例子

抛出一个例子叭:求一组整数数组的各项平均值。

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

	l := len(arr)

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

	avg = sum / float32(l)
	return avg
}
复制代码

拿着上一篇文章的遗产 —— 数字生成器测试了一下效果:

当然也可以写一段自动生成数据测试的代码,经检验,10w 级别数据 2.67s,100w 级数据 312.33s:

func main() {
	var arr []float32
	for i := 0; i < 100000; i++ {
		arr = append(arr, float32(rand.Intn(100000))/rand.Float32())
	}
	fmt.Println(getAverage(arr))
}
复制代码

输出如下:

572976.3
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享