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.