golang T 和 *T的方法集是什么关系?

Go方法本质:接收者、方法集与接口实现原理 在Go语言中,'方法'并非传统面向对象中的类成员函数,而是绑定到类型的函数,其核心是接收者(receiver)机制。理解接收者类型(值vs指针)直接关系到内存行为、状态修改能力与接口满足性;而方法集(Method Set)规则——即T仅包含T接收者方法、*T包含T和*T接收者方法——是判断类型能否实现接口的唯一依据。这一设计支撑了Go的零成本抽象、隐式接口实现与鸭子类型,广泛应用于fmt.Stringer、自定义支付处理器等场景。掌握接收者选择策略与方法集逻辑,是写出健壮、可组合Go代码的基础。 阅读详情

golang T 和 *T的方法集是什么关系?

1.结论

  • *T 包含所有 T的方法集,是编译器生成的语法糖(包装方法),实际我们写的非接口类型*T的场景,编译器会进行“指针解引用”,转而调用T类型方法。包装方法并不是为了解决我们不同接收者的调用。

  • T只包含T的方法集

  • 什么是指针解引用?

    // pt 是 *T 类型,是指向T的指针
    pt.A() // *T类型的方法调用
    实际上是下面的方式
    (*pt).A() // (*pt)就是指针取值,解引用, 将*pt转成T类型,再调用T的方法
    
    简单来说,就是没有调用*T的包装方法,而是先指针解引用,类型转成T了再调用T的原始方法。所以不是为了方便我们混合类型调用。
    

2.生成包装方法的原因

  • 为了支持接口

interface 的方法,并不能直接“指针解引用”转为具体的类型后调用,因为编译期间并不能确定实现接口的具体类型,没法"指针解引用"

接收者是函数参数的第一个参数,类似python 语言的self, 分配在栈上,由于编译器不能直接“指针解引用”,就没法知道第一个参数该分配多少空间。那就变相实现咯,给你生成一个一毛一样的,仅仅接收者是 *T

编译器会自动生成同名包装方法,所以语法层面禁止我们给T和*T生成同名方法

3.More

  • 空接口
```
type eface {
   _type *_type // _type叫类型元数据,指向实际被装载(被赋值)的对象的具体类型元数据
   data *unsafe.Pointer 
}

eface的e是empty的缩写,将一个具体的值obj赋值给一个空接口的时候,其实是将obj的_type 和 地址对应赋值给这两个字段
```
  • 非空接口
 type iface {
    tab *itab // itab是interface table,接口参照表,具体长相看下面
    data *unsafe.Pointer 
 }
 
 type itab struct {
    inter *interfacetype //接口自己的类型元数据
    _type *_type // 被装载(被赋值)的对象的类型元数据
    hash uint32 //类型哈希值
    fun [1]uintptr // 方法地址数组,从被赋值的对象的方法元数据那里,拷贝到这里,省得每次都要去具体对象的类型那里去找
 }
 
 var i iface
 var obj XXX
 i = obj // 这一步干了啥呢?下面:
 ```
 
 1.同上,将`obj地址`赋值给`i.data`; 将`obj的_type`赋值给`i.itab._type`
 2.将obj的`方法元数据`数据拷贝到`i.itab.fun`
 3.obj的类型哈希 跟 inter类型哈希求亦或,赋值给 hash字段
 
 



对象:方法集调用 方法集调用 N类型,有两个方法,当我们用N类型调用的时候,理论上只执行String,但是如果我们用N类型调用Inc是不是合法的呢? type N int func (n *N) Inc() { *n++ } func (n N) String() string { return strconv.Itoa(int(n)) } func main() { var n N ... 阅读详情

相关推荐

T大树洞:Golang后端架构解析与实战

本文还有配套的精品资源,点击获取 简介:通过深入分析“T大树洞”项目的Golang后端,可以掌握其设计理念、架构模式和关键功能实现。本课程详细介绍项目结构、依赖管理、Web框架使用、数据库交互、并发与性能优化、错误处理、API设计与测试以及安全与授权机制。学员将学习如何利用Golang构建高效、简洁且并发能力强的后端服务,并了解真实项目中的最佳实践。 1. Gol...

weixin_35189483的博客 1649

GoLang之T和*T的方法集是啥关系

GoLang之T和*T的方法集是啥关系

weixin_52690231的博客 814

自动驾驶轨迹规划算法——Apollo EM Planner

Apollo EM Planner 是百度自动驾驶系统中的轨迹规划算法,采用期望-最大化(EM)迭代优化思想。其核心是将轨迹规划分解为路径优化(E-Step)和速度优化(M-Step)两个子问题,在Frenet坐标系下交替求解。算法先通过动态规划(DP)搜索粗路径,再使用二次规划(QP)进行平滑优化,并结合障碍物信息生成安全走廊。相较Lattice、Hybrid A*等规划器,EM Planner具有更好的实时性、动态障碍物处理能力和轨迹平滑性,适用于城市道路、高速公路等复杂场景。该算法通过解耦路径与速度优

swaggytiger的博客 2665

GoLang之T和*T的方法集

基于我们之前介绍过的类型元数据相关知识,T和*T是两种类型,分别有着自己的类型元数据,一些元数据相关知识t he兴替是两种类型,分别有着自己的类型元数据,而根据自定义类型的类型元数据可以找得到该类型关联的方法列表。既然T和T各有各的方法集,那为什么还要限制T和T不能定义同名方法,又怎么会有"*T的方法集包含T的方法集合“这种说法?

qq_53267860的博客 1833

RK3568 解决MIPI屏幕开机只显示uboot logo的问题

之前写过一篇文章介绍了RK3568驱动MIPI屏幕的方法,这次产品迭代,硬件改版,选型的新的屏幕了。所以再次开启调试屏幕的过程。本以为会和上次一样会轻车熟路,事情总是事与愿违,同样的路,遇到新的坑。

fhqlongteng的博客 5425

利用Ghidra与SVD插件实现STM32固件深度逆向分析

本文详细介绍了如何利用Ghidra逆向工程框架结合SVD插件,实现对STM32固件(.bin文件)的深度逆向分析。通过加载描述芯片外设寄存器的SVD文件,Ghidra能将晦涩的硬件地址操作转换为可读的寄存器符号,极大提升了对嵌入式固件中通信协议、安全校验等关键逻辑的分析效率。文章涵盖了从Java环境搭建、工具配置到实战逆向解析的完整流程。

peach的博客 942

Golang 所有的 T 类型都有 *T 类型吗?

Golang 所有的 T 类型都有 *T 类型吗?

wgchen 404

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

【golang】泛型学习

go泛型

huangfengnt的博客 2182

CoaXPress FMC子卡:高速图像采集与FPGA原型开发实战指南

在机器视觉和工业检测领域,高速、可靠的数据传输是核心需求。CoaXPress(CXP)协议作为一种基于同轴电缆的高速接口标准,通过其高带宽、长距离传输和低延迟的特性,有效解决了传统接口在确定性实时传输方面的短板。其技术价值在于为海量图像数据提供了稳定、高效的物理层和数据链路层解决方案,广泛应用于半导体检测、医疗成像等对吞吐量有极致要求的场景。要实现CXP系统的快速原型验证,集成了高速SerDes接口和时钟管理的FMC子卡与FPGA开发板的组合成为关键。这种平台将复杂的硬件设计封装,让开发者能聚焦于图像处理算

weixin_31815843的博客 278

【007】C++编程必知:原码、补码、反码的全面解读

计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。

Lion_Long的博客 2917

浅谈Golang T和*T方法集的关系

T和*T的方法集四种调用场景接口传值,调用值接收者接口传指针,调用指针接收者接口传指针,调用值接收者(success)接口传值,调用指针接收者(error)原因剖析总结 四种调用场景 接口传值,调用值接收者 package main type Iface interface { hello() } type Stu struct { } func (c Stu) hello() { panic("implement me") } func main(){ var IfTs Iface var s

清风 1590

OpenClaw 性能调优五步法

本文介绍了优化OpenClaw性能的五步方法,将响应时间从3秒降至300毫秒。首先建立性能基线,分析模型加载、上下文检索等主要瓶颈。五步优化包括:1)启用模型缓存减少60%延迟;2)优化记忆检索策略降低25%延迟;3)并行化工具调用节省40%时间;4)智能选择轻量级模型减少50%推理时间;5)启用流式输出改善70%感知延迟。最终整体性能提升10倍,并建议建立持续监控机制。这些优化方法经过实战验证,适用于不同规模的OpenClaw部署场景。

刘一说的IT专栏 1427

golang中的值传递与引用传递,如何理解结构体的方法?为什么 T 和 *T 有不同的方法集?

golang中的值传递与引用传递,如何理解结构体的方法?为什么 T 和 *T 有不同的方法集?

猛犸象 524

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1047

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

GoLang之方法集

GoLang之方法集

weixin_52690231的博客 597

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Go的方法集详解

前言Go语言以其本身具有的高并发特性,在云计算开发中,得到了广泛的应用,也深受广大开发者的欢迎。但是大家对go语言真的了解了么?本文作者经过对go语言的多年实践应用,现对go语言中的方法...

360技术 585

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

go方法集

普通情况下,类型 T 和 T 上的方法集是互相继承的,即接收器是T和T时,方法都可以调用成功. but: 在接口中的method,对于普通类型T: T的方法集里不会继承包含*T实现的method,除非T自己实现相对应的method。 但是,*T会继承T的方法集。 type test interface { Test() } type User struct { Name strin...

w___kai的博客 297

go reflect 取指针_Go的方法集详解

女主宣言Go语言以其本身具有的高并发特性,在云计算开发中,得到了广泛的应用,也深受广大开发者的欢迎。但是大家对go语言真的了解了么?本文作者经过对go语言的多年实践应用,现对go语言中的方法集进行了一次详细的总结,并通过实验进行了验证,相信对于go语言爱好者有很大的帮助。下来就跟随作者一起学习下吧。PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!1什么是方法集 在...

weixin_26870929的博客 410

Go——组合和方法集

Go函数的调用实参都是值拷贝,方法调用参数传递也是一样的机制,具体类型变量传递给接口时也是值拷贝,如果传递给接口变量的是值类型,但调用方法的接收者是指针类型,则程序运行时虽然能够将接收者转换为指针,但这个指针是副本的指针,并不是我们期望的原变量的指针。具体类型传递给接口时编译器会进行严格的方法集校验。使用type定义的新类型不会继承原有类型的方法,有个特例就是命名结构类型,命名结构类型可以嵌套其他的命名类型的字段,外层的结构类型是可以调用嵌入字段类型的方法,这种调用既可以是显式的调用,也可以是隐式的调用。

吴声子夜歌的博客 557

golang 接口

golang 接口,方法集,golang 接口内存布局

convict_EVA的专栏 2921

Golang中的方法集与方法调用问题

问题提要 之前写代码的时候遇到了一个问题:自己编写了一个接口,然后又写了一个结构体实现这个接口,在通过函数调用接口方法时出现了问题。 代码如下: type Validator interface { Valid() bool } type LoginInput struct { Username string Password string } func (input *LoginInput) Valid() bool { // 一些检验逻辑 // 返回校验结果 } fun

phpduang的博客 858

学习《GO语言学习笔记》的学习笔记之6.3 方法之方法集 (详解)

本文初学者阅读 6.3 方法集 类型有一个与之相关的方法集(method set), 这决定了它是否实现某个接口. - 类型T方法集包含所有receiver T 方法 - 类型 *T方法集包含所有receiver T + *T方法. 可利用反射(reflet)测试这些规则 package main import ( "fmt" "reflect" ) type S struct{} ...

诸葛老刘的博客 282

go json float32 转为_Go:一个隐藏在方法集和方法调用中且易被忽略的小细节

作为一个长期从事Go语言开发的程序猿,笔者不敢说自己是老油条但也勉强算一个小油条。然而就在今天,笔者研究TLS/SSL握手源码的时候,突然灵光一闪,想到了一个和自己认知不符的现象,于是赶紧写了一个例子验证一番,结果当头一棒直到码这篇文章时依旧懵逼。话不多说,上锤!不好意思,不是这个锤,是下面这个:type set interface { set1(s string) set2(s str...

weixin_31437777的博客 156
上一篇: 手写LRU
下一篇: golang defer实现
secretx
博客等级 码龄16年 72粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值