In GO, rule is, i metodi possono essere definiti solo su named type e puntatore a named type .
In C, sotto codice , le operazioni sono definite sul tipo (ad esempio List
) ,
typedef struct List List; //list.h
typedef struct {
bool(*canHandle)(ImplType);
List*(*createList)();
....
const void*(*listGetItem)(List*, const int);
.....
void(*swap)(List*, int, int);
}ListHandler;
typedef struct{
ListHandler *handler;
}ListRtti;
typedef struct List{
ListRtti rtti; // operation on type List
const void **array;
/* For housekeeping - Array enhancement/shrink */
int lastItemPosition;
int size;
}List;
In Java, le operazioni sono definite sul tipo (ad esempio DList
),
public class DList {
private DListNode sentinel;
private int size;
public void addItem(Object item){
...
}
....
}
Ma in GO, codice di seguito, le operazioni sono consentite su named type e puntatore al tipo di nome .
package main
type Cat struct {
}
func (c Cat) foo() {
// do stuff_
}
func (c *Cat) foo() {
// do stuff_
}
func main() {
}
Domanda:
1)
Qual è l'idea di definire un metodo su un puntatore al tipo con nome?
2)
Come può sapere un programmatore in anticipo, se foo()
deve funzionare come valore per valore / riferimento? Perché GO compiler limita il metodo di definizione su entrambi i puntatori named typed e al tipo named ?