Diferencia entre el receptor de puntero y el receptor de valor en la implementación con el marco Iris

Estoy estudiando Iris Framework recientemente. Encontré una pregunta cuando estaba implementando el controlador. Como siguiente:

package controller

import "github.com/kataras/iris"    

type Pages struct{
}

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

Para usar este controlador, implementé el siguiente script de entrada:

package main

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

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

Pero cuando compilé el código, recibí el siguiente mensaje de error:

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)

Después de cambiar la declaración a:

ctrl := &controller.Pages{}

Luego el compilador pasó sin quejas.

La pregunta es: pensé que las siguientes declaraciones son iguales, ya que el compilador GO realizará la conversión bajo la tabla:

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

¿Por qué no puedo usarctrl := controller.Pages{} como el parámetro parairis.Handle(), en vez dectrl := &controller.Pages{} como el parámetro parairis.Handle()?

Gracias por tu tiempo y por compartir.

Respuestas a la pregunta(2)

Su respuesta a la pregunta