0

0

Go语言中方法接收器与参数的核心区别解析

霞舞

霞舞

发布时间:2025-12-26 17:05:01

|

894人浏览过

|

来源于php中文网

原创

Go语言中方法接收器与参数的核心区别解析

go中,接收器是方法所属的类型实例(类似c#的this),而参数是显式传入的值;接收器决定方法归属和调用绑定方式,参数仅用于传递数据。二者在语义、作用域和绑定时机上存在本质差异。

在Go语言中,接收器(receiver)参数(parameter) 虽然都出现在函数签名中,但扮演完全不同的角色:

  • 接收器:定义方法“属于谁”。它紧接在func关键字之后、方法名之前,语法为(r ReceiverType)或(r *ReceiverType)。它不是函数的输入参数,而是方法调用的主体——即调用该方法的变量本身。例如:

    type Page struct {
        Title string
        Body  []byte
    }
    
    func (p *Page) Save() error { // ← p 是接收器,代表被调用的 *Page 实例
        filename := p.Title + ".txt"
        return ioutil.WriteFile(filename, p.Body, 0600)
    }
    
    // 调用时:
    p := &Page{Title: "Home", Body: []byte("Hello")}
    p.Save() // ← p 是接收器,无需显式传入;Save() 无参数

    此处 p 并非普通参数,而是方法上下文中的“所有者”,编译器自动将调用者绑定到该标识符。

  • 参数:位于方法名后的括号内,是显式传入的数据,用于补充方法执行所需的信息。例如:

    AITDK
    AITDK

    免费AI SEO工具,SEO的AI生成器

    下载

    立即学习go语言免费学习笔记(深入)”;

    func (p *Page) SaveAs(filename string) error { // ← filename 是参数
        return ioutil.WriteFile(filename, p.Body, 0600)
    }
    p.SaveAs("backup.txt") // ← "backup.txt" 是实参,对应形参 filename

关键区别在于绑定时机与多态机制
✅ 接收器类型(尤其是接口类型)直接影响方法集和动态分派——若接收器是接口(如 func (r io.Reader) Read(...)),实际调用的方法由运行时具体类型决定(类似虚函数);
❌ 参数永远是静态类型,不参与方法查找或接口实现判定。

⚠️ 注意事项:

  • 接收器可以是值类型或指针类型,影响是否能修改原值(指针接收器可修改字段,值接收器操作副本);
  • 同一类型的所有方法必须保持接收器一致性(全用值或全用指针)以避免意外的接口实现缺失;
  • 接收器名称(如p)仅在方法体内可见,不占用外部命名空间,也不参与导出规则。

简言之:接收器回答“谁在做事”,参数回答“还要做什么事”。理解这一区分,是掌握Go面向对象设计、接口实现与方法集规则的基础。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

46

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

14

2025.11.27

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

267

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

250

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

980

2023.10.19

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号