02-形参和实参

1. 概述

1.1 形参(形式参数)

在函数定义中出现的参数。
可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。

1.2 实参(实际参数)

函数被调用时给出的参数。
包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

1.3 举例说明

下边代码中,ab为实参,xy为形参

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("=============挂印封金===============")

}
  • 输出
下邳之战前关羽势力:"蜀"
=============下邳之战===============
下邳之战后关羽势力:"魏"
=============挂印封金===============
最终关羽势力:"魏"

结果说明:

  • 实参传入函数之前,关羽势力为蜀
  • 实参传入函数后,实参关羽的地址被传给形参投降将领指针
  • 函数中,投降将领指针的势力被函数修改为魏
  • 函数结束后,打印关羽势力为魏。
  • 结果分析
    因为传入函数是关羽的地址,投降将领指针的类型是指针,指向了实参关羽的存储地址,当函数中投降将领指针指向地址的值被改变,意味着实参关羽的值被改变了

posted on 2021-11-20 23:59  运维开发玄德公  阅读(19)  评论(0编辑  收藏  举报  来源

导航