gpt4 book ai didi

types - Go methods sets - 指针类型 *T 与接收者 T 的调用方法

转载 作者:IT王子 更新时间:2023-10-29 01:22:32 29 4
gpt4 key购买 nike

spec说:

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).

我理解为: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 上调用 *T 的方法,但编译器足够聪明,可以为你获取变量的引用,有效地调用

(&user).SayWat()

这解释了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().

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

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

关于types - Go methods sets - 指针类型 *T 与接收者 T 的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433050/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com