tutorial programming lenguaje learning language guide goo golang developer go

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.