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

社区订阅号:Golang语言社区 社区服务号:Golang技术社区 如有问题或建议,请公众号留言

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

1、常规传递

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

例如:

package main
import (
    "fmt"
)
func swap(a int, b int) {
    var temp int
    temp = a
    a = b
    b = temp
}
func main() {
    x := 5
    y := 10
    swap(x, y)
    fmt.Print(x, y)
}

输出结果:5 10

传递给swap的是x,y的值得拷贝,函数对拷贝的值做了交换,但却没有改变x,y的值。

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

我们还是用上面的的例子,稍作修改如下:

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

输出结果:10 5

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

使用数组元素作为函数参数时,其使用方法和普通变量相同,即是一个“值拷贝”。

例:

package main
import (
    "fmt"
)
func function(a int) {
    a += 100
}
func main() {
    var s = [5]int{1, 2, 3, 4, 5}
    function(s[2])
    fmt.Print(s[2])
}

输出结果:3

可以看到将数组元素s[2]的值作为函数的实参,不管对形参做什么操作,实参都没有改变。

4、数组名作为函数参数

和其他语言不同的是,go语言在将数组名作为函数参数的时候,参数传递即是对数组的复制。在形参中对数组元素的修改都不会影响到数组元素原来的值。这个和上面的类似,就不贴代码了,有兴趣的自行编写代码测试下吧。

5、slice作为函数参数

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

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

运行结果:101

6、函数作为参数

在go语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用。例如:

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

运行结果:11

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

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

Golang语言社区

ID:Golangweb

游戏服务器架构丨分布式技术丨大数据丨游戏算法学习

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏野路子程序员

【野路子】正则表达式~极速入门图文教程

34680
来自专栏noteless

原型模式 prototype 创建型 设计模式(七)

用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象

12020
来自专栏个人随笔

设计模式(1)

  注:本文章示例为C#代码,设计模式通用任何编程语言,可放心阅读 设计模式(3W1H)   What?针对特定问题特出的特定的解决方案   Why?让程序有更...

330110
来自专栏数据结构与算法

1860 最大数

1860 最大数 1998年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行...

31370
来自专栏程序员互动联盟

【编程基础】聊聊C语言-第一只螃蟹

上一篇我们介绍了开发C语言需要了解的基础术语和开发C语言常用的工具做好了进行C语言编程的准备,现在我们开始操刀烹炸C语言编程世界的第一道菜-hello wor...

369130
来自专栏大内老A

深入理解C# 3.x的新特性(2):Extension Method[上篇]

在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda ...

20060
来自专栏鸿的学习笔记

Python中__str__和__repr__方法的区别

在stackoverflow有一个很精辟的回答解释这两个内置方法的区别,简单来说,__str__方法是表现给使用者使用的,而__repr__方法是给程序员用的...

12020
来自专栏大内老A

[原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression

在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda ...

23080
来自专栏大数据和云计算技术

#算法基础#选择和插入排序

算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第二篇《选择和插入排序》,非常赞!希望对大家有帮助,大家会喜欢! 系列文章: 由快速排序到分治思想 ...

35260
来自专栏我是攻城师

你不知道的Java的split的小问题

28860

扫码关注云+社区

领取腾讯云代金券