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

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

四种调用场景

接口传值,调用值接收者

package main
type Iface interface {
  hello()
}
type Stu struct {
}
func (c Stu) hello() {
  panic("implement me")
}
func main(){
  var IfTs Iface
  var stu Stu
  IfTs=stu
  IfTs.hello()
}

接口传指针,调用指针接收者

package main
type Iface interface {
  hello()
}
type Stu struct {
}
func (c *Stu) hello() {
  panic("implement me")
}
func main(){
  var IfTs Iface
  var stu Stu
  IfTs=&stu
  IfTs.hello()
}

接口传指针,调用值接收者(success)

package main
type Iface interface {
  hello()
}
type Stu struct {
}
func (c Stu) hello() {
  panic("implement me")
}
func main(){
  var IfTs Iface
  var stu Stu
  IfTs=&stu
  IfTs.hello()
}

接口传值,调用指针接收者(error)

package main
type Iface interface {
  hello()
}
type Stu struct {
}
func (c *Stu) hello() {
  panic("implement me")
}
func main(){
  var IfTs Iface
  var stu Stu
  IfTs=stu//err
  IfTs.hello()
}

原因剖析

首先要明确一点,T和*T是两种不同的类型。

那为什么第三种情况可以正常运行呢?通过*T类型的变量调用T类型的接收者的方法,只是一种语法糖,编译器会在调用端进行指针解引用。

那为什么第四种情况会err呢?因为*T和T是两种不同的类型,这里没有语法糖,T类型没有实现接口的方法,自然会err咯。无法将’stu’ (类型Stu)用作类型Iface类型,未实现’Iface’

总结

因为通过 *T 类型的变量调用T类型的接收者的方法,是一种语法糖,所以可以简单的理解为 *T 的方法集包括了所有的T方法集,这也就是为什么会有人说,只要接收者里面有一个是指针接收者,那就把所有的方法接收者都改为指针接收者的原因了。不过需要注意的是T和 *T 是两种不同的类型!


目录
相关文章
|
JSON 缓存 Go
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
484 0
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
544 2
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
543 87
Golang的math包常用方法
|
Kubernetes Go API
构建 Golang 应用程序的实用方法
构建 Golang 应用程序的实用方法
|
Go 开发者
Golang深入浅出之-Go语言方法与接收者:面向对象编程初探
【4月更文挑战第22天】Go语言无类和继承,但通过方法与接收者实现OOP。方法是带有接收者的特殊函数,接收者决定方法可作用于哪些类型。值接收者不会改变原始值,指针接收者则会。每个类型有相关方法集,满足接口所有方法即实现该接口。理解并正确使用这些概念能避免常见问题,写出高效代码。Go的OOP机制虽不同于传统,但具有灵活性和实用性。
339 1
|
Go Java C++
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
293 0
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
|
Cloud Native 程序员 Go
100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践
100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践
315 0
|
编译器 Go
golang 接口变量的赋值和方法的调用
golang 接口变量的赋值和方法的调用
golang 接口变量的赋值和方法的调用
|
Go
leetcode-每日一题1408. 数组中的字符串匹配(暴力枚举)和Golang里关于Index方法和Contains方法区别
题目要求我们找到字符串数组中存在字符串是其他单词的子字符串,看到题目给我们的n的范围是[1,100],所以我们可以通过暴力枚举用两个for循环一层指子串一层指找存在这个子串的单词,找到则找下个一个子串
391 0
leetcode-每日一题1408. 数组中的字符串匹配(暴力枚举)和Golang里关于Index方法和Contains方法区别
|
中间件 Java Linux
知识分享之Golang——Gin学习之开放所有接口的OPTION方法
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
649 0
知识分享之Golang——Gin学习之开放所有接口的OPTION方法

推荐镜像

更多