开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:方法的调用和传参机制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9677
方法的调用和传参机制
内容介绍
一、方法的调用和传参机制的原理
二、方法的调用和传参机制案例1
三、方法的调用和传参机制案例2
一、方法的调用和传参机制的原理
原理:
方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时会将调用方法的变量也当做实参传递给方法。
二、方法的调用和传参机制案例1
画出 getSum 方法的执行过程并加以说明
- 核心代码
func (p Person)
getSum
(
n1 int,n2 int) int
{
r
e
turn n1 + n2
n1 :=10
n2 := 20
res =p
.
getsum(n1,n2
)
fmt.Print1n("res=", res)
- 代码分析:
1)在通过一个变量去调用方法时,其调用机制和函数一样
2)不一样的地方是变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝)
l 内存分析图
l 说明分析
Main 函数中有独立的数据空间称为 main 栈,有变量 n1、n2,均是基本数据类型,它们分别指向空间[10]、[20],先执行类型推导符右面的代码,即 p.getSum,根据已知原则,会生成一个新的独立的数据空间,称之为 getSum 栈。调用 main 栈时,会把 n1和 n2传给 getSum 中的 n1和 n2,进行值的拷贝,因此 getSum 栈里也会有 n1的值为10,同时还会有一个 n2的值为20,因为它们满足值拷贝的原则。在主函数调用时,p 指向一个结构体 person,里面存有字段 name 值为 tom。在完成 p.getSum 的时候,不仅将 n1和 n2进行值的拷贝,还会把主函数里的 p 也当作一个参数传出,即在 getSum 栈里 p 也有一份相同的数据类型,但是他们存有独立的数据空间。即 p 在调用getSum 的时候,p 本身会当作一个形参传给 getSum 栈,会在该栈里生成一个相同的值:tom,完成值的拷贝。接着执行 n1+n2,再去执行 return n1+n2,即10+20返回30给 res,相当于主栈里存有 res=30,最终在终端输出 res:=30。
三、方法的调用和传参机制案例2
请编写一个程序,要求如下:
1)声明一个结构体 circle,字段为 radius
2)声明一个方法 area 和 circle 绑定,可以返回面积。
3)提示:画出 area 执行过程并加以说明
- 核心代码
package main import("fmt")
type circle struct {
radius float64
func (c Circle) area()float64{
return 3.14*c.radius* c.radius
}
func main (){
var c Circle
c.radius =4.0
res :=c.area()
fmt.Print1n("面积是=", res)
}
- 代码分析
新建一个文件夹,命名为 methodDemo。新建 main.go 文件,输入通用代码
package main import("fmt");输入 type circle struct {
radius float64 新建一个结构体,;输入 func (c Circle) area()float64{
return 3.14*c.radius* c.radius}
将 area和circle 完成绑定;通过 var c circle c.radius =4.0 res :=c.area()
fmt.Print1n("面积是=", res) 进行调用,输出结果为50.24,与理论值一致。
- 内存分析图
- 分析说明
创建 circle 结构体,首先主栈(main 栈)里有一个 c,c 指向一个结构体,结构体里面有一个字段 radius,赋予4.0,完成调用(c.area)。根据规则会创建一个新的独立的数据空间,称为 area 栈。area 栈里会把 c 及其字段传入,并在
该栈执行运算(3.14*c.radius*c.radius),此时 c.radius 是从 area 栈中获取的并不是从 main 栈中获取的。运算结束后return 到 main 栈桥中,得到 res:=50.24,并输出面积值。此时控制台(终端)就会输出面积面积是50.24,返回后 area 空间被销毁,主函数执行完毕后,整个内存都会销毁。