go语言:函数参数传递详解-阿里云开发者社区

开发者社区> 科技小能手> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
15 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6935 0
7.2 函数的参数
1、给 b 变量设定一个默认的值 如果实参传入的时候,指定了 b 的值,那 b 优先选择传入的实参,当 b 没有值时,才会用默认值 def funcA(a,b=0):     print(a)     print(b) funcA(1)        # b 变量选择默认实参...
469 0
Go语言的web程序写法
一切来自于扩展。。。 核心也即处理输入输出。。。 // helloworld project main.go package main import ( "fmt" "html/template" "log" "net/http" "strings" ) func sayhelloName(w http.
757 0
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个...
973 0
C#调用C函数(DLL)传递参数问题
备忘: 1.C函数参数为字符串char*。如果是入参,对应C#中string或StringBuilder;如果是出参对应C#中StringBuider;   2.C函数参数为结构体指针,需在C#中对应定义结构体。
872 0
详解函数返回值和参数 | 手把手教你入门Python之四十三
本节重点介绍函数返回值,函数参数详解
635 0
14491
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载