概述

倡议先浏览 指针 大节。

例子

指针变量参数

package mainimport "fmt"func double(n int) {    n *= 2}func doubleWithPtr(n *int) {    *n *= 2}func main() {    n := 100    double(n)    fmt.Printf("应用一般变量作为函数参数执行实现后, n = %d\n", n) // 能够看到,变量值并未发生变化    doubleWithPtr(&n)    fmt.Printf("应用指针变量作为函数参数执行实现后, n = %d\n", n) // 变量值曾经发生变化}// $ go run main.go// 输入如下 /**  应用一般变量作为函数参数执行实现后, n = 100  应用指针变量作为函数参数执行实现后, n = 200*/

指针数组变量参数

package mainimport "fmt"func double(numbers [3]int) {    for _, v := range numbers {        v *= 2    }}func doubleWithPtr(numbers *[3]int) {    for i := range numbers {        numbers[i] *= 2    }}func main() {    numbers := [3]int{100, 200, 300}    double(numbers)    fmt.Printf("应用数组变量作为函数参数执行实现后, n = %d\n", numbers) // 能够看到,数组元素并未发生变化    doubleWithPtr(&numbers)    fmt.Printf("应用指针数组变量作为函数参数执行实现后, n = %d\n", numbers) // 数组元素曾经发生变化}// $ go run main.go// 输入如下 /**  应用数组变量作为函数参数执行实现后, n = [100 200 300]  应用指针数组变量作为函数参数执行实现后, n = [200 400 600]*/

切片参数

在 切片 大节中讲到,切片的底层援用了一个数组,能够简略地了解为:切片自身是一个指针,指向底层数组的元素
所以罕用的形式的是将函数参数定义为切片类型。

package mainimport "fmt"func double(numbers []int) {    for i := range numbers {        numbers[i] *= 2    }}func main() {    numbers := []int{100, 200, 300}    double(numbers)    fmt.Printf("应用切片变量作为函数参数执行实现后, n = %d\n", numbers) // 切片元素曾经发生变化}// $ go run main.go// 输入如下 /**  应用切片变量作为函数参数执行实现后, n = [200 400 600]*/

小结

默认状况下,Go 的函数参数传递形式应用 值传递,也就是说,批改参数的值不会影响到 原变量, 如果心愿批改参数的同时批改 原变量,须要传递变量的援用 (指针)。

对于根底数据类型 (如 int, float, bool 等),须要传递值的地址,对于曾经是 援用类型 的数据类型 (如切片、通道等),间接传递值即可。

分割我