go语言:函数参数传递详解

简介:
+关注继续查看

    参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数.

    1、常规传递

        使用普通变量作为函数参数的时候,在传递参数时只是对变量值的拷贝,即将实参的值复制给变参,当函数对变参进行处理时,并不会影响原来实参的值。

egg:

package main
import "fmt"
func aa(a, b int) {
    var temp int
    temp = a
    a = b
    b = temp
    fmt.Println(a, b)//处理了a,b交换的值
}
func main() {
    x := 5
    y := 10
    aa(x, y)
    fmt.Println(x, y)//交换后还是打印原来的值
}

输出结果:

C:/Users/cherry/go/src/aa/aa.exe  [C:/Users/cherry/go/src/aa]

10 5

5 10

成功: 进程退出代码 0.

2、指针函数

    函数的变量不仅可以使用普通变量,还可以使用指针变量,使用指针变量作为函数的参数时,在进行参数传递时将是一个地址,即将实参的内存地址复制给变参,这时变参的修改也将会影响到实参的值。

egg:

package main
import "fmt"
func aa(a *int, b *int) {
    var temp int
    temp = *a
    *a = *b
    *b = temp
    //fmt.Println(temp, *a, *b)
}
func main() {
    x := 5
    y := 10
    aa(&x, &y)
    fmt.Println(x, y)
}

执行结果:

C:/Users/cherry/go/src/aa/aa.exe  [C:/Users/cherry/go/src/aa]

10 5

成功: 进程退出代码 0.


3、数组元素作为函数参数

    使用数组元素作为参数时,其使用的方法和普通变量相同,既是一个"值拷贝"

package main
import "fmt"
func aa(a int) {
    a += 100
    fmt.Printf("打印内部的累加后的值:%d\n", a)
}
func main() {
    var s = [...]int{1, 2, 3, 4, 5, 6}
    fmt.Printf("开始调用函数....\n")
    aa(s[3])
    fmt.Printf("调用结束...")
    fmt.Println(s[3])
}

执行结果:

C:/Users/cherry/go/src/aa/aa.exe  [C:/Users/cherry/go/src/aa]

开始调用函数....

打印内部的累加后的值:104

调用结束...4

成功: 进程退出代码 0.

4、数组名作为函数参数:和其他语言不同的是,GO语言在将数组名字作为函数参数的时候,参数传递既是对数组的复制,在形参中对数组元素的修改都不会影响到数组元素的原来的值,CODE如下:

package main
import "fmt"
func aa(s [6]int) {
    s[3] += 100
    fmt.Printf("打印内部的累加后的值:%d\n", s)
}
func main() {
    var s = [...]int{1, 2, 3, 4, 5, 6}
    fmt.Printf("开始调用函数....\n")
    aa(s)
    fmt.Printf("调用结束...")
    fmt.Println(s)
}

执行结果:

C:/Users/cherry/go/src/aa/aa.exe  [C:/Users/cherry/go/src/aa]

开始调用函数....

打印内部的累加后的值:[1 2 3 104 5 6]

调用结束...[1 2 3 4 5 6]

##将数组作为参数传入时,必须指定传入数组的长度和初始定义长度一样

5、slice作为函数参数

在使用sclice作为函数参数时,进行参数传递将是一个地址拷贝,即将底层数组的内存地址复制给参数slice,对slice元素的操作就是对底层数组元素的操作。

egg:

package main
import "fmt"
func aa(s1 []int) {
    s1[0] += 100
}
func main() {
    var a = [5]int{1, 2, 3, 4, 5}
    var s []int = a[0:]
    aa(s)
    fmt.Println(s[0])
    fmt.Println(a)
}

执行结果:

C:/Users/cherry/go/src/aa/aa.exe  [C:/Users/cherry/go/src/aa]

101

[101 2 3 4 5]//原数组的的值发生了变化

6、函数作为参数:GO语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。

package main
import "fmt"
func aa(a, b int, bb func(int, int) int) {
    fmt.Println(bb(a, b))
}
func bb(a, b int) int {
    return a + b
}
func main() {
    var a, b int = 5, 6
    f := bb
    fmt.Println(f)
    aa(a, b, f)
    fmt.Println(a, b, f)

}

函数bb作为函数aa的形参,而变量f是一个函数类型,作为aa()调用时的实参



本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1963695

相关文章
|
8天前
|
存储 缓存 编译器
Go函数全景:从基础到高阶的深度探索
Go函数全景:从基础到高阶的深度探索
29 0
|
21天前
|
存储 Go 开发者
Go 函数
函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。 ### 创建函数 要创建(通常称为声明)一个函数,请执行以下操作: - 使用 `func` 关键字。 - 指定函数的名称,后跟括号 `()`。 - 最后,在花括号 `{}` 内添加定义函数应执行的代码。 **语法**
26 0
|
1月前
|
Go 开发者
Go 输出函数
Go语言拥有三个用于输出文本的函数: - Print() - Println() - Printf() Print() 函数以其默认格式打印其参数。 示例
41 1
|
1月前
|
监控 Java Go
Go的系统监控函数
Go提供了许多系统监控函数。
41 0
|
2月前
|
Go
高阶函数编程:探索Go语言中的函数一等公民
Go 函数一等公民。你是否听说过 `Go` 语言中的函数是一等公民?如果没有,那么恭喜你,本文将带你一起揭开这个神秘的面纱。如果你已经了解这个概念,你是否知道为什么 `Go` 语言中的函数被称为一等公民?不管你的答案是什么,通过阅读本文,你将对这个概念有更深入的了解。
37 0
高阶函数编程:探索Go语言中的函数一等公民
|
3月前
|
存储 设计模式 Go
Go 函数选项模式(Functional Options Pattern)
本文对 Go 函数选项模式(Functional Options Pattern)进行了详细介绍,并通过封装一个消息结构体的例子,展示了如何使用函数选项模式进行代码实现。
67 0
|
4月前
|
Go
go 1.6 废弃ioutil包后的替换函数
go 1.6 废弃ioutil包后的替换函数
688 0
|
4月前
|
安全 Go
Go函数下篇:defer和闭包
Go函数下篇:defer和闭包
|
4月前
|
Go
上篇:Go函数的骚包玩法有哪些?
上篇:Go函数的骚包玩法有哪些?
|
5月前
|
Go
GO语言-04函数
自己学习Go语言学习过程中的记录与总结,希望对你能有帮助。 第四篇:学习Go语言的函数定义,匿名函数,闭包结构
36 0
推荐文章
更多