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

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

转载于:https://blog.51cto.com/dbaspace/1963695

go语言:函数参数传递详解相关推荐

  1. C++函数参数传递详解

    目录 第一种传递方式:按值传递 第二种传递方式:指针传递 第三种传递方式:引用传递 const参数 main()函数的参数 大家都知道,在函数中参数分为实参和形参(参看本篇文章)https://mp. ...

  2. c 传入易语言字节,易语言字节集参数传递详解

    易语言多线程之字节集参数传递 传递文本可以直接传递文本的指针,但是字节集却不能这样,看下面直接传递字节集指针的代码: .版本 2 .支持库 spec .支持库 EThread .程序集 窗口程序集1 ...

  3. C++语言函数重载详解和示例

    C++ 函数重载的概念 在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同.例如把变量的值写入文件,变量的类型int.long.double.char,需要通过参数把变量传入函数.在 ...

  4. C语言---函数介绍详解

    生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识--左拉 文章目录 前言 函数 模块化程序设计方法 函数的定义 函数的分类 函数定义角度 库函数 自定义函数 函数形式角度 无参函数 ...

  5. 七、C语言函数定义详解

    文章目录 1.函数的声明和定义 2.函数的调用 3.函数参数的两种传递方式 1.传值调用(C语言默认传递参数方式) 2.引用调用 4.函数的分类 1.内部函数(静态函数) 2.外部函数 1.函数的声明 ...

  6. 计算机科学类专升本复习之“C语言函数定义”详解(初稿)

    今天首先要讲的是C语言的无参函数定义 函数 如果不接收"用户传递"的数据,那么定义时可以不带参数 例如: dataType kangkang(){ //nb } dataType: ...

  7. 【C语言函数参数详解】——实际参数(实参)形式参数(形参)

    文章目录 一.什么是实际参数(实参) 二.什么是形式参数(形参) 三.形参与实参的关系 这篇文章我们一起学习一下函数的参数,函数的参数分为实参和形参. 一.什么是实际参数(实参) 首先我们来学习实参, ...

  8. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  9. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  10. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

最新文章

  1. AMD Cpu 性能分析
  2. 总奖金近9万!视频超分辨率大赛等你来战!
  3. C++相关:动态内存和智能指针
  4. 贴几张最新最精彩的电影海报
  5. 梅森旋转产生随机数c语言实现,C++生成随机数的实现代码
  6. Yum离线安装(一) --- RPM 打包技术与典型 SPEC 文件分析
  7. 基于java的教学评价系统的设计与实现
  8. java中的移位操作
  9. PHP计算字符串长度
  10. idea打包 jar文件
  11. python mql4跟单_MT4软件本地跟单方法的实现 -
  12. php code128扫码不能识别,求助excel中code128字体打印出的条码扫描枪读不出
  13. 音视频技术开发周刊 | 241
  14. 个人网站有赞云支付接口申请方法
  15. 学习使用linux下tags文件
  16. 两个ip linux,教你ipconfig有两个ip地址的解决方法
  17. MaxScript调用IGame
  18. 爱快云微信连wifi3.1用户前期准备工作
  19. android播放语音,切换听筒模式遇到的问题
  20. JavaScript高级笔记_002_构造函数和原型

热门文章

  1. 来到博客园许久,却还未开始写一篇自己的博客。从今天开始,每周都会更新自己的学习内容。...
  2. 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用...
  3. C# Sql 触发器
  4. [转载] 七龙珠第一部——第050话 海盗的陷阱
  5. [原]JavaScript必备知识系列-作用域
  6. com scripting读书笔记
  7. [redis]redis五种数据类型和应用场景
  8. MySQL实现SQL Server排名函数
  9. 150. 买卖股票的最佳时机 II
  10. jQuery星级评分插件