dtmsaqtly798322992 2013-10-17 17:08
浏览 110
已采纳

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

Go spec says:

The method set of any other type T consists of all methods with receiver type T. The method set of the corresponding pointer type *T is the set of all methods with receiver *T or T (that is, it also contains the method set of T).

I understand this as: T has its own method set, while *T has it own method set plus the method set of T, because it can dereference receiver *T to T and call the method. Therefore, we can call some method with receiver *T of variable type T.

So I decided to verify my logic:

package main

import (
  "fmt"
  "reflect"
)

type User struct{}

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

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

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

  user.SayWat()
}

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

I am a bit confused. It looks like I can call methods "of *T" on T? I have a bit wider example http://play.golang.org/p/RROPMj534A, which confuses me too. Is there some vice versa type inference?

Am I missing something, or my logic is incorrect?

Thanks!

  • 写回答

1条回答 默认 最新

  • dti3914 2013-10-17 17:34
    关注

    You cannot call a method of *T on T, but the compiler is smart enough to take the reference of the variable for you, effectively calling

    (&user).SayWat()
    

    This is explained here:

    Calls: A method call x.m() is valid if the method set of (the type of) x contains m and the argument list can be assigned to the parameter list of m. If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

    To understand the difference, you can for instance take a return value (non-addressable):

    func aUser() User {
        return User{}
    }
    
    ...
    
    aUser().SayWat()
    

    Fails with error:

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?