Go核心开发学习笔记(廿二) —— 函数和方法区别

本文深入探讨了函数和方法在传参时的区别,重点分析了值类型和引用类型的处理方式,以及它们如何影响结构体变量的字段值。通过具体示例代码,展示了不同情况下变量值的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数和方法的区别

  1. 函数出传参,值类型就是值类型,引用类型就是引用类型,不可混用,不能把值类型数据传入指针参数中。
  2. 方法的传参,值类型和引用类型取决于 func ( x x_type ) () {…} —> x_type或者*x_type
  3. 传入x参数无论是值类型还是指针类型在编译器这儿都能通过并且按照同等方式处理,即 x == &x,举例说明也就是<结构体变量>.<结构体字段> == <&结构体变量>.<结构体字段>,my.Name == (&my).Name
  4. 前面是结构体变量传入说明,后面具体方法能不能改变初始化字段值取决于方法的x_type类型,这个与函数一致,Mylist类型则函数内字段值赋值不影响main()中初始化字段值的改变,*Mylist类型则函数内字段值赋值影响main()中初始化字段值的改变。

经常面试挖坑就在这儿,下面用程序举例说明

package main

import "fmt"

type Mylist struct {
	Name string
	Age string
}

func (my Mylist) value_type() {
	fmt.Println("都能传,但是到这儿都是值类型")
}

func (my *Mylist) ptr_type() {
	my.Name = "zzz"
	fmt.Println("都能传,但是到这儿都是引用类型")
}

func ptr1_type(my *Mylist) {
	fmt.Println("只能传指针类型")
}

func value1_type(my Mylist) {
	fmt.Println("只能传值类型")
}

func main() {
	var my Mylist          //定义一个结构体实例
	my.Name = "lululu"     //初始化结构体实例my中的字段Name为"lululu"
	
	my.value_type()         //对于方法中,由于编译器优化,传递的结构体变量既可以是值也可以是地址
	fmt.Println(my.Name)    //无论是my为值还是地址,最终传递给绑定变量的都是值拷贝
	(&my).value_type()      
	fmt.Println((&my).Name)

	my.ptr_type()           //但是具体的my.Name的值还是要看结构体绑定变量到底是值类型还是指针类型
	fmt.Println(my.Name)    //结构体变量为值类型,则方法内值的改变不影响main()中初始化变量的值
	(&my).ptr_type()        //结构体变量若为引用类型,则方法内值的改变影响main()中初始化变量的值
	fmt.Println((&my).Name)

	value1_type(my)         //函数中不存在传入绑定变量,所以和之前一样,值类型只能传值类型,地址类型只能传地址类型,不可my和&my代表一个意思
	ptr1_type(&my)          //值类型函数内的改变不影响main()初始化变量的值,引用类型函数内的改变影响main()初始化变量的值,
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值