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

方法接收者的歧义

郎磊
2023-03-14
问题内容

今天就去旅行。我注意到我可以将结构文字传递给与指向结构的指针关联的方法,反之亦然。为什么允许这样做?

package main

import (
    "fmt"
)

type Vertex struct {
    X, Y float64
}

func (v Vertex) Scale (f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func (v *Vertex) ScaleP(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := &Vertex{3, 4}
    vLiteral := Vertex{3, 4}

    v.Scale(5)
    fmt.Println(v)

    v.ScaleP(5)
    fmt.Println(v)

    vLiteral.Scale(5)
    fmt.Println(vLiteral)

    vLiteral.ScaleP(5)
    fmt.Println(vLiteral)
}

输出:

&{3 4}
&{15 20}
{3 4}
{15 20}

问题答案:

请参阅方法集:

一个类型可能具有与之关联的方法集(§接口类型,§Method声明)。接口类型的方法集是其接口。其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型
T的方法集是接收者

T或T的所有方法的集合(也就是说,它还包含T)。进一步的规则适用于包含匿名字段的结构,如有关结构类型的部分中所述。其他任何类型的方法集都为空。在方法集中,每个方法必须具有唯一的方法名称。

类型的方法集确定该类型实现的接口以及可以使用该类型的接收器调用的方法。

编辑:

另请参阅电话:

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



 类似资料:
  • 有人能告诉我这些方法模棱两可的原因吗?提前谢谢你。

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

  • 问题内容: 在Golang中工作,正在尝试使用接口将使用相似方法的一组结构归为一组。简而言之,我有这个: 然后,应该用作接口的结构: 我想念什么?还是我做错了什么? 问题答案: 如果您的接口这样声明: 然后,任何实现a的类型都将满足该接口。 在您的情况下,然后创建此方法: 这意味着类型满足接口。 但是..注意那里。没有实现该接口,而是由谁来实现。 因此,在尝试为接口变量分配类型时,请确保使用指针而

  • 问题内容: Go spec说: 其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含T)。 我的理解是:T有自己的方法集,而 T有自己的方法集加上T的方法集,因为它可以将接收者 T取消引用到T并调用该方法。因此,我们可以使用变量T的接收者* T调用某些方法。 因此,我决定验证自己的逻辑: http://play.golan

  • 问题内容: 查看下面显示的G​​o文档,我很难理解接收器和参数之间的区别: 该方法的签名如下:这是一个名为save的方法,该方法将指向Page的指针作为其接收者p。它不带任何参数,并返回错误类型的值。 问题答案: 该接收机是像在C#:在所述接收器和所述参数是,和。执行该函数时,参数引用参数的副本。接收方和参数之间的重要区别在于,当接收方是调用站点上的接口类型时,要调用的功能是动态而非静态确定的。

  • 问题内容: public static void main(String… args){ then(bar()); // Compilation Error } 编译结果(从命令行) 为什么这种方法模棱两可?该代码在Java 7下成功编译! 将方法栏更改为: 编译没有任何问题,但是在IntelliJ Idea中报告为错误(无法解析method )。 此代码在Java 7下失败- : Java版本