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()调用时的实参
转载于:https://blog.51cto.com/dbaspace/1963695
go语言:函数参数传递详解相关推荐
- C++函数参数传递详解
目录 第一种传递方式:按值传递 第二种传递方式:指针传递 第三种传递方式:引用传递 const参数 main()函数的参数 大家都知道,在函数中参数分为实参和形参(参看本篇文章)https://mp. ...
- c 传入易语言字节,易语言字节集参数传递详解
易语言多线程之字节集参数传递 传递文本可以直接传递文本的指针,但是字节集却不能这样,看下面直接传递字节集指针的代码: .版本 2 .支持库 spec .支持库 EThread .程序集 窗口程序集1 ...
- C++语言函数重载详解和示例
C++ 函数重载的概念 在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同.例如把变量的值写入文件,变量的类型int.long.double.char,需要通过参数把变量传入函数.在 ...
- C语言---函数介绍详解
生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识--左拉 文章目录 前言 函数 模块化程序设计方法 函数的定义 函数的分类 函数定义角度 库函数 自定义函数 函数形式角度 无参函数 ...
- 七、C语言函数定义详解
文章目录 1.函数的声明和定义 2.函数的调用 3.函数参数的两种传递方式 1.传值调用(C语言默认传递参数方式) 2.引用调用 4.函数的分类 1.内部函数(静态函数) 2.外部函数 1.函数的声明 ...
- 计算机科学类专升本复习之“C语言函数定义”详解(初稿)
今天首先要讲的是C语言的无参函数定义 函数 如果不接收"用户传递"的数据,那么定义时可以不带参数 例如: dataType kangkang(){ //nb } dataType: ...
- 【C语言函数参数详解】——实际参数(实参)形式参数(形参)
文章目录 一.什么是实际参数(实参) 二.什么是形式参数(形参) 三.形参与实参的关系 这篇文章我们一起学习一下函数的参数,函数的参数分为实参和形参. 一.什么是实际参数(实参) 首先我们来学习实参, ...
- c语言 is函数,关于C语言回调函数的详解~
原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
最新文章
- AMD Cpu 性能分析
- 总奖金近9万!视频超分辨率大赛等你来战!
- C++相关:动态内存和智能指针
- 贴几张最新最精彩的电影海报
- 梅森旋转产生随机数c语言实现,C++生成随机数的实现代码
- Yum离线安装(一) --- RPM 打包技术与典型 SPEC 文件分析
- 基于java的教学评价系统的设计与实现
- java中的移位操作
- PHP计算字符串长度
- idea打包 jar文件
- python mql4跟单_MT4软件本地跟单方法的实现 -
- php code128扫码不能识别,求助excel中code128字体打印出的条码扫描枪读不出
- 音视频技术开发周刊 | 241
- 个人网站有赞云支付接口申请方法
- 学习使用linux下tags文件
- 两个ip linux,教你ipconfig有两个ip地址的解决方法
- MaxScript调用IGame
- 爱快云微信连wifi3.1用户前期准备工作
- android播放语音,切换听筒模式遇到的问题
- JavaScript高级笔记_002_构造函数和原型
热门文章
- 来到博客园许久,却还未开始写一篇自己的博客。从今天开始,每周都会更新自己的学习内容。...
- 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用...
- C# Sql 触发器
- [转载] 七龙珠第一部——第050话 海盗的陷阱
- [原]JavaScript必备知识系列-作用域
- com scripting读书笔记
- [redis]redis五种数据类型和应用场景
- MySQL实现SQL Server排名函数
- 150. 买卖股票的最佳时机 II
- jQuery星级评分插件