首页 > 解决方案 > 接口不能调用self方法

问题描述

我定义了两个函数。当我将指针传递给它时,我无法获得定义的方法。为什么是这样?

type Visitor interface {
    work()
}

func test(v *Visitor)  {
    v.work() // error
}


func test1(v Visitor)  {
    v.work() // ok
}

错误:

v.work 未定义(类型 *Visitor 是指向接口的指针,而不是接口)

有谁知道为什么,ths

标签: pointersgomethodsinterface

解决方案


func test(v *Visitor)  {
    v.work() // error
}

v.work()应该是方法调用。但是v是 type *Visitor,一个指向接口的指针。指向接口的指针有 0 个方法,它不实现任何东西(空接口除外interface{})。

当使用非指针时,值v(或者更确切地说是它的类型)有一个方法work(),所以你可以调用它:

func test(v Visitor)  {
    v.work() // ok
}

在这里v.work()有效,因为vis 的类型Visitor是接口,并且它包含方法work()

可能令人困惑的是,如果您将方法添加到(非指针、非接口)具体类型,则相应的指针类型也将具有该方法,您可以调用它。这是规范:方法集:

一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集由声明为接收者类型T的所有方法T组成。对应指针类型 *T的方法集是所有用receiver *Tor声明的方法的T集合(即它还包含 的方法集T)。进一步的规则适用于包含嵌入字段的结构,如结构类型部分所述。任何其他类型都有一个空方法集。在方法集中,每个方法必须有一个唯一的空白 方法名称

不同之处在于您尝试了相同的接口类型,这是行不通的。它适用于具体(非接口)类型。教训是永远不要使用指向接口的指针,除非你能解释为什么需要它(它很少需要)。


推荐阅读