Pointer Receiver und Value Receiver Unterschied in der Implementierung mit Iris Framework

Ich studiere gerade Iris Framework. Bei der Implementierung des Handlers ist eine Frage aufgetreten. Wie folgt:

package controller

import "github.com/kataras/iris"    

type Pages struct{
}

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

Um diesen Controller nutzen zu können, habe ich folgendes Eingabeskript implementiert:

package main

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

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

Aber als ich den Code kompilierte, wurde folgende Fehlermeldung angezeigt:

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)

Nachdem ich die Deklaration geändert habe in:

ctrl := &controller.Pages{}

Dann hat der Compiler ohne Beanstandung bestanden.

Die Frage ist: Ich dachte, die folgenden Aussagen sind gleich, da der GO-Compiler die Konvertierung unter der Tabelle vornimmt:

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()
}

Warum kann ich nichtctrl := controller.Pages{} als Parameter füriris.Handle(), Anstatt vonctrl := &controller.Pages{} als Parameter füriris.Handle()?

Vielen Dank für Ihre Zeit und das Teilen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage