当前位置: 首页 > 面试题库 >

Go方法集-带有接收者T的指针类型* T的调用方法

易焱
2023-03-14
问题内容

Go spec说:

其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含T)。

我的理解是:T有自己的方法集,而 T有自己的方法集加上T的方法集,因为它可以将接收者 T取消引用到T并调用该方法。因此,我们可以使用变量T的接收者*
T调用某些方法。

因此,我决定验证自己的逻辑:

package main

import (
  "fmt"
  "reflect"
)

type User struct{}

func (self *User) SayWat() {
  fmt.Println(self)
  fmt.Println(reflect.TypeOf(self))
  fmt.Println("WAT\n")
}

func main() {
  var user User = User{}

  fmt.Println(reflect.TypeOf(user), "\n")

  user.SayWat()
}

http://play.golang.org/p/xMKuLzUbIf

我有点困惑。看来我可以在T上调用方法“ of * T”?我有一个更广泛的示例http://play.golang.org/p/RROPMj534A,这也使我感到困惑。反之亦然有类型推断吗?

我是否缺少某些东西,或者我的逻辑不正确?

谢谢!


问题答案:

您不能调用*Ton 的方法T,但是编译器足够聪明,可以为您获取变量的引用,从而有效地调用

(&user).SayWat()

这在这里解释:

调用:如果x的方法集包含m并且参数列表可以分配给m的参数列表,则方法调用xm()有效。如果x是可寻址的并且&x的方法集包含m,则xm()是(&x).m()的简写。

要了解差异,例如,您可以采用一个返回值(不可寻址):

func aUser() User {
    return User{}
}

...

aUser().SayWat()

失败并出现错误:

prog.go:40: cannot call pointer method on aUser()
prog.go:40: cannot take the address of aUser()

http://play.golang.org/p/HOTKiiOK7S



 类似资料:
  • 问题内容: 我最近读了《 Go编程语言》 ,这是学习golang编程语言的好资源。在6.2节中有一段关于类型的副本实例在方法中是否为指针接收者的段落,我无法理解。有没有什么可以用有意义的例子来解释本段的? 6.2使用指针接收器的方法 如果所有命名类型T的方法本身都具有接收者T类型(不是* T),则可以安全地复制该类型的实例;调用其任何方法必然会产生一个副本。例如,time.Duration值被自由

  • 问题内容: 我有这个示例代码 无法正常工作,因为其接收器不是指针类型。 如果我将方法更改为指针接收器,那么我希望它可以正常工作,如下所示: 编译会导致以下错误: 如何在不创建副本的情况下使接口 和 方法实现实际实例的值? 这是一个可入侵的代码段:https : //play.golang.org/p/ghW0mk0IuU 问题答案: 您指向结构的指针应实现该接口。这样,您可以修改其字段。 查看我如

  • 本文向大家介绍Go语言的方法接受者类型用值类型还是指针类型?,包括了Go语言的方法接受者类型用值类型还是指针类型?的使用技巧和注意事项,需要的朋友参考一下 概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 1.如果接受者是一个 map,func 或者

  • 当结构体实现一个接口时,可以在方法中设置一个接收者,比如对于以下接口: type Inter interface { foo() } 结构体在实现它时,方法的接收者类型可以是:值、指针。比如: type S struct {} func (s S) foo() {} // 值类型 func (s *S) foo() {} // 或者指针类型 在使用结构体初始化接口变量时,结构体的类型

  • 本文向大家介绍Java泛型 T与T的使用方法详解,包括了Java泛型 T与T的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。 在集合框架(Collec

  • 问题内容: 根据这个问题的回答 关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法 但实际上我可以对非指针值执行指针方法: 那么,这是怎么了?这是新功能吗?还是对问题的回答是错误的? 问题答案: 您正在对指针值调用“指针方法”。在表达式中: 是类型(非指针);由于该方法具有指针接收者,并且由于接收者值是非指针且可寻址,因此它是以下各项的简写形式: 这是在规范中: