golang结构体函数中值接收函数和指针接收函数的区别 1. 值接收者 vs 指针接收者这两种写法的核心区别是接收者类型不同一个是值接收者一个是指针接收者。// 值接收者接收的是 Focus 的一个副本func(Focus)aaa()string{returnfocus}// 指针接收者接收的是 Focus 实例的地址func(f*Focus)bbb()string{returnfocus}2. 调用方式对比// 值接收者可以用值或指针调用f:Focus{}f.aaa()// ✅ 可以(f).aaa()// ✅ 也可以// 指针接收者也可以用值或指针调用Go 会自动取地址f.bbb()// ✅ Go 自动转成 (f).bbb()(f).bbb()// ✅ 可以Go 编译器会自动帮你转换所以调用时看起来没区别。3. 本质区别对比点值接收者(Focus)指针接收者(f *Focus)是否拷贝数据✅ 会拷贝整个结构体❌ 不会拷贝直接操作原对象能否修改结构体字段❌ 不能改的是副本✅ 可以内存开销较大结构体大时较小只传地址是否实现接口看接口定义看接口定义4. 用例子看区别func(f Focus)SetTitleV(){f.Titlechanged// 改的是副本原对象不变}func(f*Focus)SetTitleP(){f.Titlechanged// 改的是原对象}调用后f:Focus{Title:old}f.SetTitleV()fmt.Println(f.Title)// 输出: oldf.SetTitleP()fmt.Println(f.Title)// 输出: changed5. 什么时候用哪种用指针接收者*Focus方法需要修改结构体字段结构体比较大避免拷贝开销一致性有些方法必须用指针那就全用指针用值接收者Focus结构体很小如简单配置方法不修改字段且你明确希望是只读操作总结一句话aaa()是值接收者操作的是副本bbb()是指针接收者操作的是原对象。但指针接收者更常见。