Go 语言向函数传递数组
Go 语言中的数组是值类型,因此在将数组传递给函数时,实际上是传递数组的副本。
如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组,我们可以通过以下两种方式来声明:
方式一
形参设定数组大小:
func myFunction(param [10]int) {
....
}
方式二
形参未设定数组大小:
func 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;
}
{
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;
}
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
以上实例中我们使用的形参并未设定数组大小。
浮点数计算输出有一定的偏差,你也可以转整型来设置精度。
实例
package main
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 结果应该是2.873
fmt.Println(c) // 输出的是2.8729999999999998
}
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 结果应该是2.873
fmt.Println(c) // 输出的是2.8729999999999998
}
设置固定精度:
实例
package main
import (
"fmt"
)
func main() {
a := 1690 // 表示1.69
b := 1700 // 表示1.70
c := a * b // 结果应该是2873000表示 2.873
fmt.Println(c) // 内部编码
fmt.Println(float64(c) / 1000000) // 显示
}
import (
"fmt"
)
func main() {
a := 1690 // 表示1.69
b := 1700 // 表示1.70
c := a * b // 结果应该是2873000表示 2.873
fmt.Println(c) // 内部编码
fmt.Println(float64(c) / 1000000) // 显示
}
如果你想要在函数内修改原始数组,可以通过传递数组的指针来实现。
以下实例演示如何向函数传递数组,函数接受一个数组和数组的指针作为参数:
实例
package main
import "fmt"
// 函数接受一个数组作为参数
func modifyArray(arr [5]int) {
for i := 0; i < len(arr); i++ {
arr[i] = arr[i] * 2
}
}
// 函数接受一个数组的指针作为参数
func modifyArrayWithPointer(arr *[5]int) {
for i := 0; i < len(*arr); i++ {
(*arr)[i] = (*arr)[i] * 2
}
}
func main() {
// 创建一个包含5个元素的整数数组
myArray := [5]int{1, 2, 3, 4, 5}
fmt.Println("Original Array:", myArray)
// 传递数组给函数,但不会修改原始数组的值
modifyArray(myArray)
fmt.Println("Array after modifyArray:", myArray)
// 传递数组的指针给函数,可以修改原始数组的值
modifyArrayWithPointer(&myArray)
fmt.Println("Array after modifyArrayWithPointer:", myArray)
}
import "fmt"
// 函数接受一个数组作为参数
func modifyArray(arr [5]int) {
for i := 0; i < len(arr); i++ {
arr[i] = arr[i] * 2
}
}
// 函数接受一个数组的指针作为参数
func modifyArrayWithPointer(arr *[5]int) {
for i := 0; i < len(*arr); i++ {
(*arr)[i] = (*arr)[i] * 2
}
}
func main() {
// 创建一个包含5个元素的整数数组
myArray := [5]int{1, 2, 3, 4, 5}
fmt.Println("Original Array:", myArray)
// 传递数组给函数,但不会修改原始数组的值
modifyArray(myArray)
fmt.Println("Array after modifyArray:", myArray)
// 传递数组的指针给函数,可以修改原始数组的值
modifyArrayWithPointer(&myArray)
fmt.Println("Array after modifyArrayWithPointer:", myArray)
}
在上面的例子中,modifyArray 函数接受一个数组,并尝试修改数组的值,但在主函数中调用后,原始数组并未被修改。相反,modifyArrayWithPointer 函数接受一个数组的指针,并通过指针修改了原始数组的值。
以上实例执行输出结果为:
Original Array: [1 2 3 4 5] Array after modifyArray: [1 2 3 4 5] Array after modifyArrayWithPointer: [2 4 6 8 10]
Go 语言数组
AlphaGao
gao***qiang@kid17.com
func main() { var array = []int{1, 2, 3, 4, 5} /* 未定义长度的数组只能传给不限制数组长度的函数 */ setArray(array) /* 定义了长度的数组只能传给限制了相同数组长度的函数 */ var array2 = [5]int{1, 2, 3, 4, 5} setArray2(array2) } func setArray(params []int) { fmt.Println("params array length of setArray is : ", len(params)) } func setArray2(params [5]int) { fmt.Println("params array length of setArray2 is : ", len(params)) }输出:
初始化数组长度后,元素可以不进行初始化,或者不进行全部初始化,但未进行数组大小初始化的数组初始化结果元素大小就为多少。
AlphaGao
gao***qiang@kid17.com
LALALA
xux***i@ict.ac.cn
多维数组传参:
package main func prt(arr [][] float32){ for i:= 0;i < 3;i++{ println(arr[i][0]) } } func main(){ var arr = [][]float32 {{-1,-2},{-3,-4},{-5}} prt(arr) }LALALA
xux***i@ict.ac.cn
samin
822***977@qq.com
我觉得这个解说有点模糊,因为没有区分数组和切片:
声明数组:
nums := [3]int{1,2,3,}声明切片:
nums := []int{1,2,3}没有所谓没有声明长度的数组存在。
samin
822***977@qq.com
zhanglei
130***7117@qq.com
与 c 语言不同,go 的数组作为函数参数传递的是副本,函数内修改数组并不改变原来的数组。
package main import "fmt" func change(nums[3] int){ nums[0]=100 } func main() { var nums=[3]int{1,2,3} change(nums) //nums并未被改变 fmt.Println(nums[0]) return }zhanglei
130***7117@qq.com
leondgarse
leo***arse@gmail.com
这里没有区分 数组 与 切片
- Go 语言的数组是值,其长度是其类型的一部分,作为函数参数时,是 值传递,函数中的修改对调用者不可见
- Go 语言中对数组的处理,一般采用 切片 的方式,切片包含对底层数组内容的引用,作为函数参数时,类似于 指针传递,函数中的修改对调用者可见
// 数组 b := [...]int{2, 3, 5, 7, 11, 13} func boo(tt [6]int) { tt[0], tt[len(tt)-1] = tt[len(tt)-1], tt[0] } boo(b) fmt.Println(b) // [2 3 5 7 11 13] // 切片 p := []int{2, 3, 5, 7, 11, 13} func poo(tt []int) { tt[0], tt[len(tt)-1] = tt[len(tt)-1], tt[0] } poo(p) fmt.Println(p) // [13 3 5 7 11 2]leondgarse
leo***arse@gmail.com
VG_xiao
159***5047@qq.com
函数里面的数组改动对定义类型为切片的数组外部数据也会有影响:
func main(){ var slice1 = []int{1,2,3,4,5,6,7,8} var array = [8]int{1,2,3,4,5,6,7,8} change_arr1(slice1) change_arr2(array) fmt.Println("slice1 = ", slice1) //[10,2,3,4,5,6,7,8] fmt.Println("array = ", array) //[1,2,3,4,5,6,7,8] } func change_arr1(arr []int) { arr[0] = 10 fmt.Println("arr = ", arr) //[10,2,3,4,5,6,7,8] } func change_arr2(arr [8]int) { arr[0] = 10 fmt.Println("arr = ", arr) //[10,2,3,4,5,6,7,8] }VG_xiao
159***5047@qq.com
王雪涵
xue***dsome@foxmail.com
看了评论,总结下几位老哥的结论,外加自己想到的引用传递。
package main import "fmt" // Go 语言的数组是值,其长度是其类型的一部分,作为函数参数时,是 值传递,函数中的修改对调用者不可见 func change1(nums [3]int) { nums[0] = 4 } // 传递进来数组的内存地址,然后定义指针变量指向该地址,则会改变数组的值 func change2(nums *[3]int) { nums[0] = 5 } // Go 语言中对数组的处理,一般采用 切片 的方式,切片包含对底层数组内容的引用,作为函数参数时,类似于 指针传递,函数中的修改对调用者可见 func change3(nums []int) { nums[0] = 6 } func main() { var nums1 = [3]int{1, 2, 3} var nums2 = []int{1, 2, 3} change1(nums1) fmt.Println(nums1) // [1 2 3] change2(&nums1) fmt.Println(nums1) // [5 2 3] change3(nums2) fmt.Println(nums2) // [6 2 3] }王雪涵
xue***dsome@foxmail.com