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,这也使我感到困惑。反之亦然有类型推断吗?
我是否缺少某些东西,或者我的逻辑不正确?
谢谢!
您不能调用*T
on 的方法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
问题内容: 根据这个问题的回答 关于指针与接收器的值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法 但实际上我可以对非指针值执行指针方法: 那么,这是怎么了?这是新功能吗?还是对问题的回答是错误的? 问题答案: 您正在对指针值调用“指针方法”。在表达式中: 是类型(非指针);由于该方法具有指针接收者,并且由于接收者值是非指针且可寻址,因此它是以下各项的简写形式: 这是在规范中: