types - tres - Método en un campo de estructura de tipo definido por un tipo literal
preguntas literales inferenciales y criticas ejemplos (1)
Al decodificar JSON, siempre he escrito explícitamente una estructura para cada objeto para poder implementar la interfaz de Stringer para los objetos individuales en una estructura principal como esta:
type Data struct {
Records []Record
}
type Record struct {
ID int
Value string
}
func (r Record) String() string {
return fmt.Sprintf("{ID:%d Value:%s}", r.ID, r.Value)
}
Recientemente descubrí que es posible hacer anidamientos con estructuras anónimas. Este método es mucho más conciso para definir la estructura de los datos que se decodificarán:
type Data struct {
Records []struct {
ID int
Value string
}
}
Pero, ¿es posible definir un método en un miembro de una estructura, particularmente un miembro que es una estructura anónima? Al igual que la implementación de la interfaz Stringer en el primer bloque de código.
No, los métodos se pueden adjuntar solo a los tipos con nombre definidos en el mismo paquete. De las especificaciones :
Un método es una función con un receptor. Una declaración de método vincula un identificador, el nombre del método, a un método. También asocia el método con el tipo de base del receptor.
MethodDecl = "func" Receiver MethodName Signature [ Body ] .
Receiver = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
BaseTypeName = identifier .
El tipo de receptor debe ser de la forma T o * T donde T es un nombre de tipo. El tipo indicado por T se llama tipo de base receptora; no debe ser un puntero o tipo de interfaz y debe declararse en el mismo paquete que el método. Se dice que el método está vinculado al tipo de base y el nombre del método solo está visible dentro de los selectores para ese tipo.
El tipo del campo Records
en el segundo ejemplo OP se define utilizando un tipo literal, es decir. la condición ''nombre de tipo'' anterior no se cumple.