gpt4 book ai didi

go - Pointer receiver 和 Value receiver 与 Iris 框架实现的区别

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

<分区>

最近在研究Iris框架。我在实现Handler的时候遇到了一个问题。喜欢以下内容:

package controller

import "github.com/kataras/iris"

type Pages struct{
}

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

为了使用这个 Controller ,我实现了如下入口脚本:

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() 的参数?

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

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