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

Iris框架在实现指针接收器和值接收器方面的差异

庄星汉
2023-03-14
问题内容

我最近正在研究虹膜框架。在实现处理程序时遇到一个问题。如下所示:

package controller

import "github.com/kataras/iris"

type Pages struct{
}

func (p *Pages) Serve(c *iris.Context) {
}

为了使用此控制器,我实现了以下输入脚本:

package main

import (
     "github.com/kataras/iris"
     "web/controller"
)

func main(){
      ctrl := controller.Pages{}
      iris.Handle("GET", "/", ctrl)
      iris.Listen(":8080")
}

但是,当我编译代码时,收到以下错误消息:

cannot use ctrl (type controllers.Pages) as type iris.Handler in argument to iris.Handle:
controllers.Pages does not implement iris.Handler (Serve method has pointer receiver)

在我将声明更改为:

ctrl := &controller.Pages{}

然后,编译器通过,没有任何抱怨。

问题是:我认为以下语句是相等的,因为GO编译器将在表下进行转换:

type Pages struct {
}

func (p *Pages) goWithPointer() {
    fmt.Println("goWithPointer")
}

func (p Pages) goWithValue() {
    fmt.Println("goWithValue")
}

func main() {
    p1 := Pages{}
    p2 := &Pages{}

    p1.goWithPointer()
    p1.goWithValue()

    p2.goWithPointer()
    p2.goWithValue()
}

为什么我不能用ctrl := controller.Pages{}作为参数iris.Handle(),而不是ctrl := &controller.Pages{}作为参数传递给iris.Handle()

感谢您的宝贵时间和分享。


问题答案:

参阅文件:

类型可能具有与之关联的方法集。接口类型的方法集是其接口。其他任何类型的方法集都T
包含使用接收器类型声明的所有方法T。对应的指针类型的方法集*T是使用接收器*T或声明的所有方法的集合T(也就是说,它也包含的方法集T)。进一步的规则适用于包含匿名字段的结构,如有关结构类型的部分中所述。其他任何类型的方法集都为空。在方法集中,每个方法必须具有唯一的非空白方法名称。

如果您有一个接口I,并且I方法集中的某些或全部方法是由接收者为的方法提供的*T(其余方法由接收者为的方法提供T),则*T满足该接口I,但T不满足。那是因为*T的方法集包含T,但不是这样。

使用ctrl := Pages{}制造错误:

cannot use ctrl (type Pages) as type Handler in argument to Handle:
Pages does not implement Handler (Serve method has pointer receiver)

使用ctrl := Pages{}需求:

func (p Pages) Serve() {
    fmt.Println(p.i)
}

虹膜处理程序是一种接口类型。像这个工作示例(请参阅评论):

package main

import "fmt"

type Handler interface {
    Serve()
}

type Pages struct {
    i int
}

func (p *Pages) Serve() {
    fmt.Println(p.i)
}

func Handle(p Handler) {
    p.Serve()
}

func main() {
    // cannot use ctrl (type Pages) as type Handler in argument to Handle:
    // Pages does not implement Handler (Serve method has pointer receiver)
    //ctrl := Pages{}
    ctrl := &Pages{101}
    Handle(ctrl)
}

输出:

101


 类似资料:
  • 问题内容: 对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: 该 文档 还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先, 它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结

  • 问题内容: 在用于golang的mongodb驱动程序中,包含以下代码: 接口清零器的定义如下: 当我实现我的结构 有用。但是,当我使用指针接收器实现IsZero方法时: 类型声明失败,并且IsZero无法执行。 谁可以给我解释一下这个? 问题答案: 据推测某处之上的有上的开关 如果您在Reflection包中查看,则此处的文档 是其中一种,又是另一种。在switch语句中,它不匹配,因为该方法的

  • 问题内容: 我很难理解为什么这些规则与指针类型.vs的方法集相关联。值类型 有人可以解释一下原因吗(从界面表的角度) (威廉·肯尼迪博客的摘录) 规格摘要 方法集 类型可能具有与之关联的方法集。接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应指针类型 T的方法集是所有以接收者 T或T声明的方法的集合(也就是说,它还包含方法T集)。进一步的规则适用于包含匿名字

  • 问题内容: 我一直在从关于指针接收器的话题中出错,我决定用谷歌搜索术语的含义,并且阅读了有关指针接收器的不同资源和文档。例如:http : //golang.org/doc/faq和http://jordanorelli.com/post/32665860244/how- to-use-interfaces-in-go。 虽然,尽管他们谈论这些术语,但仍未能准确定义它们。不过,从上下文来看,我认为

  • 问题内容: 已关闭 。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗? 添加详细信息并通过编辑此帖子来澄清问题。 3个月前关闭。 改善这个问题 关于“ X不能实现Y(…方法具有指针接收器) ”的事情已经有一些问答,但是对我来说,他们似乎在谈论不同的事情,而不适用于我的具体情况。 因此,我没有使问题变得非常具体,而是使之变得笼统和抽象-似乎有几种不同的情况可以使此错误发生,请有人总结一

  • 问题内容: 我有这个示例代码 无法正常工作,因为其接收器不是指针类型。 如果我将方法更改为指针接收器,那么我希望它可以正常工作,如下所示: 编译会导致以下错误: 如何在不创建副本的情况下使接口 和 方法实现实际实例的值? 这是一个可入侵的代码段:https : //play.golang.org/p/ghW0mk0IuU 问题答案: 您指向结构的指针应实现该接口。这样,您可以修改其字段。 查看我如