02-形参和实参
1. 概述
1.1 形参(形式参数)
在函数定义中出现的参数。
可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
1.2 实参(实际参数)
函数被调用时给出的参数。
包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
1.3 举例说明
下边代码中,
a
和b
为实参,x
和y
为形参
package main
import "fmt"
func main(){
a := 7
b := 8
result := getSum(a,b)
fmt.Printf("%d 和 %d 的和是:%d",a,b,result)
}
func getSum(x int,y int)int{
sum := x + y
return sum
}
2. 直传递
2.1 概念
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
2.2 示例
代码说明:
- 定义结构体
将领
,实例化一个武将关羽。- 定义
下邳之战函数
,投降将领
为该函数的形参。- main函数调用
下邳之战
函数,并将关羽
作为实参传入该函数
- 代码
package main
import "fmt"
type 将领 struct {
姓名 string
势力 string
}
func main() {
关羽 := 将领{
姓名: "关羽",
势力: "蜀"}
fmt.Printf("下邳之战前关羽势力:%q\n",关羽.势力)
下邳之战(关羽)
fmt.Printf("最终关羽势力:%q\n",关羽.势力)
}
func 下邳之战(投降将领 将领){
fmt.Println("=============下邳之战===============")
投降将领.势力 = "魏"
fmt.Printf("下邳之战后关羽势力:%q\n",投降将领.势力)
fmt.Println("=============挂印封金===============")
}
- 输出结果
结果说明:
- 实参传入函数之前,关羽示例为蜀
- 实参传入函数后,实参
关羽
被传给形参投降将领
- 函数中,
投降将领
的势力被函数修改为魏- 函数结束后,打印关羽势力,仍为蜀。
下邳之战前关羽势力:"蜀"
=============下邳之战===============
下邳之战后关羽势力:"魏"
=============挂印封金===============
最终关羽势力:"蜀"
- 结果分析
说明直接传递变量,函数不会改变实参的值。
3. 引用传递
3.1 概念
引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
3.2 示例
代码说明:
- 定义结构体
将领
,实例化一个武将关羽
。- 定义
下邳之战函数
,投降将领指针
为该函数的形参。- main函数调用
下邳之战
函数,并将关羽
的地址作为实参赋值给投降将领指针
- 代码
package main
import "fmt"
type 将领 struct {
姓名 string
势力 string
}
func main() {
关羽 := 将领{
姓名: "关羽指针",
势力: "蜀"}
fmt.Printf("下邳之战前关羽势力:%q\n",关羽.势力)
下邳之战(&关羽)
fmt.Printf("最终关羽势力:%q\n",关羽.势力)
}
func 下邳之战(投降将领指针 *将领){
fmt.Println("=============下邳之战===============")
投降将领指针.势力 = "魏"
fmt.Printf("下邳之战后关羽势力:%q\n",投降将领指针.势力)
fmt.Println("=============挂印封金===============")
}
- 输出
下邳之战前关羽势力:"蜀"
=============下邳之战===============
下邳之战后关羽势力:"魏"
=============挂印封金===============
最终关羽势力:"魏"
结果说明:
- 实参传入函数之前,关羽势力为蜀
- 实参传入函数后,实参
关羽
的地址被传给形参投降将领指针
- 函数中,
投降将领指针
的势力被函数修改为魏- 函数结束后,打印关羽势力为魏。
- 结果分析
因为传入函数是关羽
的地址,投降将领指针
的类型是指针,指向了实参关羽的存储地址,当函数中投降将领指针
指向地址的值被改变,意味着实参关羽
的值被改变了