Golang 数组(切片)的值传递与引用传递

Golang 数组(切片)的值传递与引用传递,第1张

Go语言中函数的参数都是按值进行传递的,即使参数是指针,也是指针的一个副本。习惯上把指针的函数参数称之为地址传参,即引用传递,而非指针的函数参数称为值传参
地址传参在大对象上效率比值传参好,在内部相当于用指针地址赋值,而不用复制整个对象

文章目录 一、数组的值传递二、数组的引用传递三、切片的引用传递

一、数组的值传递

Golang数组作为参数传入函数时,进行的是值传递,这里与Java数组的引用传递是不同的,示例如下

package main

import "fmt"

func main() {
	arr := [8]int{}
	for i := 0; i < 8; i++ {
		arr[i] = i
	}

	fmt.Println(arr)
	exchange(arr)
	fmt.Println(arr)
}

func exchange(arr [8]int) {
	for k, v := range arr {
		arr[k] = v * 2
	}
}

运行结果如下:

二、数组的引用传递

默认情况下Golang的数组传递是值传递,但当我们想要对传入的数组进行修改时,可以使用指针来对数组进行 *** 作,如下

package main

import "fmt"

func main() {
	arr := [8]int{}
	for i := 0; i < 8; i++ {
		arr[i] = i
	}

	fmt.Println(arr)
	exchangeByAddress(&arr)
	fmt.Println(arr)
}

func exchangeByAddress(arr *[8]int) {
	for k, v := range *arr {
		arr[k] = v * 2
	}
}

运行结果如下:

三、切片的引用传递

Golang中的切片与Java中的ArrayList集合类似,进行的是引用传递

package main

import "fmt"

func main() {
	slice := []int{1,2,3,4,5}
	fmt.Println(slice)
	exchangeSlice(slice)
	fmt.Println(slice)
}

func exchangeSlice(slice []int) {
	for k, v := range slice {
		slice[k] = v * 2
	}
}

运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存