浅谈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 之控制器方法和输入输出数据
107 0
|
2月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
176 87
Golang的math包常用方法
|
3月前
|
Kubernetes Go API
构建 Golang 应用程序的实用方法
构建 Golang 应用程序的实用方法
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言方法与接收者:面向对象编程初探
【4月更文挑战第22天】Go语言无类和继承,但通过方法与接收者实现OOP。方法是带有接收者的特殊函数,接收者决定方法可作用于哪些类型。值接收者不会改变原始值,指针接收者则会。每个类型有相关方法集,满足接口所有方法即实现该接口。理解并正确使用这些概念能避免常见问题,写出高效代码。Go的OOP机制虽不同于传统,但具有灵活性和实用性。
49 1
|
6月前
|
Go Java C++
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
70 0
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
|
Cloud Native 程序员 Go
100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践
100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践
47 0
|
编译器 Linux Go
Golang减小体积包的方法和c语言调用go封装的动态库步骤
Golang减小体积包的方法和c语言调用go封装的动态库步骤
|
运维 NoSQL 编译器
学习golang(8) 初探:方法
学习golang(8) 初探:方法
89 0
|
编译器 Go
golang 接口变量的赋值和方法的调用
golang 接口变量的赋值和方法的调用
golang 接口变量的赋值和方法的调用
|
Go 数据库
[Golang] gorm从版本1升到版本2,数据库close()方法被弃用,应该怎样去关闭数据库?
[Golang] gorm从版本1升到版本2,数据库close()方法被弃用,应该怎样去关闭数据库?