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

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()调用时的实参。

最新文章

  1. (UWP开发)更为合理的一种ListView下拉刷新(PullToRefresh)实现方法
  2. Hive Tutorial(上)(Hive 入门指导)
  3. 如何指定个别属性进行transition过渡
  4. Java读取Level-1行情dbf文件极致优化(2)
  5. Android 升级SQLite数据库
  6. 读书笔记:javascript高级技巧(一)
  7. JAVA入门第二季 第一章 类和对象
  8. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
  9. HDU 5823 (状压dp)
  10. Cookie工具类 - CookieUtil.java
  11. Configure Log Shipping
  12. WordPress HMS Testimonials 多个跨站脚本漏洞和跨站请求伪造漏洞
  13. 【C语言探索之旅】 第二部分第七课:文件读写
  14. NPY and girls
  15. Android如何调用第三方SO库(转)
  16. AOP:代理思想 (没有考虑到Spring)
  17. Javascript高级编程学习笔记(86)—— Canvas(3)绘制矩形
  18. git reset之后找回本地未提交的代码
  19. IIS 7上部署PHP【后续一】
  20. linux、centos下查看系统版本、bios版本,内存信息等

热门文章

  1. UVA - 1152 4 Values whose Sum is 0问题分解,二分查找
  2. Persona5
  3. while else语句
  4. 【转】基于 Apache 在本地配置多个虚拟主机
  5. [转]linux多命令的顺序执行
  6. POJ 1145 Tree Summing
  7. 【转】关于AI的目标导向型行动计划
  8. math & 三元一次方程组的解法
  9. Welcome-to-Swift-02基本运算符
  10. 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp