lenguaje - “El método requiere un receptor de puntero” en Go Programming Language
learning go (2)
Acabo de ver una presentación del lenguaje de programación Go y pensé que intentaría escribir algunas líneas. Todo funcionó bien hasta que intenté usar una interfaz en esta situación. ¿Cómo puedo solucionar esto?
package main
import "fmt"
type entity float32
func (e *entity) inc() {
*e++
}
type incer interface {
inc()
}
func doSomething(i incer) {
i.inc()
}
func main() {
fmt.Println("Hello, 世界")
var e entity = 3
e.inc()
doSomething(e)
fmt.Println(e)
}
Me sale el error del compilador:
prog.go:24: cannot use e (type entity) as type incer in function argument:
entity does not implement incer (inc method requires pointer receiver)
Quiero usar un puntero para que inc () afecte a la entidad fuera de la función. ¿Cuál es la sintaxis que debo usar?
/ Ricky
Cámbialo a: doSomething (& e). func (e * entity) inc () satisface la interfaz de incer solo para * tipo de entidad. No hay inc () solo para el tipo de entidad y eso es lo que está pasando a doSomething ().
Creo que hay cierta confusión aquí. inc
es un método del tipo *entity
, y no del tipo entity
(si bien puede llamar métodos sobre valores directamente en los punteros, generalmente no puede llamar métodos sobre indicadores directamente sobre los valores). Lo que puede confundirte es por qué podrías llamar a e.inc()
, en lugar de tener que hacer (&e).inc()
. Este es un caso especial poco conocido documentado en la parte inferior de la sección Calls en la especificación del lenguaje, que dice si x
es direccionable, y el conjunto de métodos de &x
contiene m
, entonces xm()
es una abreviatura de (&x).m()
. Esto se aplica a este caso porque e
es una variable, por lo que es direccionable; pero otras expresiones pueden no ser direccionables. Sin embargo, le recomendaría que no utilice este método abreviado, ya que causa confusión; te hace pensar que e
ajusta a la interfaz inter
, mientras que no lo hace.