形参和实参的区别是什么

Python013

形参和实参的区别是什么,第1张

有以下区别:

1、主体不同:实参在调用有参函数时,函数名后面括号中的参数为“实际参数”。形参不是实际存在变量,又称虚拟变量。

2、目的不同:实参可以是常量、变量或表达式,无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值,以便把这些值传送给形参。

需要注意当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。

    前段时间,我们实验室用go作为后台开发语言开发了一个web项目,由于这是自己第一次使用go语言进行开发,在开发过程中,一味着追求完成任务,在编码的时候没有太注重性能,虽然勉强实现了功能,但是对go语言的理解还是比较浅显的。下面来谈谈自己对go语言中函数与方法的理解。

普通函数:

    go函数可以返回多个值

    值传递: 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样函数中如果对参数进行修改,将不会影响到实际参数

    引用传递: 引用传递是指在调用函数将实际参数的地址传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数。

一般来说go语言函数的 接收者(也就是形参)一般放在函数名后面 ,不能将指针类型的数据直接传递,也就是说函数形参如果是值类型,调用者必须使用值作为实参过来,如果函数形参是指针类型,则函数调用者需使用指针作为实参来调用。

普通方法:

接收者是在func关键字后面,而不是在函数名称后面,接收者可以是自己定义的一个类型,这个类型可以是struct、interface,一个方法就是一个包含了接收者的函数,接收者可以是命名类型或者是结构体类型的一个值或者是一个指针。

下面是一个例子来说明方法和函数的区别(重点)

golang方法(method)返回值提取结构体(struct)取不到地址的原因是,①返回值并没有保存到变量中,返回值本身只是临时保存在程序运行的堆栈的某个不确定位置,不能取地址;②实参取地址用的操作符是是&,而形参声明变量类型为指针,需要地址值用的才是*;③声明形参为指针的参数的实参只能为地址值。

故先把修改后的代码列出,修改要点是把“*NewPerson1().Speak()”改为“var b=NewPerson1()(&b).Speak()”,同时把“NewPerson2().Speak()”改成“var a=NewPerson2()(&a).Speak()”,代码列出如下:

package main

import "fmt"

type PersonA struct{

 name string

}

func (p *PersonA) Speak () {

 fmt.Println ( "person speak" ,p.name)

}

func (p PersonA) Walk ( ){

 fmt . Println ( "person walk",p.name)}

func NewPerson1()(p PersonA){

 return PersonA{"new Person1"}}

func NewPerson2()(p PersonA){

 return PersonA{"new Person2"}}

func main () {

 var a=NewPerson2 ()(&a).Speak () 

a .Walk ()

 fmt. Println ("--------------------") 

var b=NewPerson1 ()(&b).Speak ()

 b.Walk ()}

go代码调试效果

关于指针变量的使用这一点go语言和其他有指针的程序语言如c语言是一样的,从来只有返回值为地址/指针,而从没有在赋值前给返回值取地址这种运算,类似的错误晚点再整理。

不一样的是,go语言更简单go语言函数可以使用结构体或者结构体的指针(pointer)以传递结构体参数,而且和c语言不一样的是,go语言没有区分结构体指针和结构体访问成员的运算符,go语言只有“.”适用于两种情况,而没有c语言为结构体指针专门准备的“->”运算符。

可以使用结构体指针,作为结构体的方法的参数以指代自身吗,