2016-01-05 13 views
5

Usando il reflection, possiamo ottenere il nome del tipo, la dimensione dello storage e la funzione del tipo specificato (come uint64, struct definito dall'utente e così via). Anche, possiamo modificare alcuni campi del tipo specificato. In che modo golang implementa i riflessi? Credo che le seguenti modalità:In che modo golan implementa la riflessione?

  1. Ogni tipo di golang, tra cui tipo definito dall'utente, a sua volta ha le informazioni su nome del tipo, campi Nome e il nome della funzione. Il riflesso di Golang legge queste informazioni o chiama la funzione.

  2. Attraverso alcuni meccanismi, Golang può ottenere il nome del tipo, la dimensione della memoria e così via. E il tipo stesso non ha queste informazioni.

Ho letto il codice di riflessione golang all'incirca. Immaginai che il golang usasse la seconda strada. Chi può descrivere l'attrezzo concreto della riflessione? O mi consiglia alcuni documenti? Leggere tutto il codice è difficile per me.

+0

In parole semplici, in che modo la riflessione di Golang ottiene le informazioni di tipo, come nome del tipo, dimensioni di archiviazione, campi, funzione e così via. Anche, la riflessione può impostare il valore. –

risposta

4

Questa è solo una panoramica e potrebbe non essere accurata al 100%, ma spero che la troverai utile.

al momento della compilazione Go linker incorporare le informazioni su tutti i tipi utilizzati dall'applicazione in eseguibile (https://github.com/golang/go/blob/master/src/runtime/symtab.go#L39)

Ogni valore interfaccia contiene un puntatore al tipo di dati descrittore (https://github.com/golang/go/blob/master/src/runtime/type.go#L14)

Durante la conversione da un tipo noto in fase di compilazione a un valore di interfaccia Il compilatore Go punterà il descrittore di tipo di questo valore di interfaccia al descrittore di tipo concreto (è noto al momento della compilazione!).

E.g. quando si chiama reflect.TypeOf(uint(87)):

  • un valore di interfaccia è stato creato dal compilatore che fa riferimento uint tipo descrittore
  • questo valore interfaccia è passato alla reflect.TypeOf funzione come argomento
  • reflect.TypeOf funzione utilizza tipo descrittore che è stato memorizzato da il linker nell'eseguibile per ottenere le informazioni di allineamento (e di altro tipo) sul tipo di uint.
1

La descrizione delle interfacce è ben descritta qui: The Laws of Reflection.

Una variabile di tipo di interfaccia memorizza una coppia: il valore di calcestruzzo assegnato alla variabile e il descrittore di tipo di quel valore.

Fondamentalmente, il tipo è noto staticamente dal codice. I tipi di interfaccia più flessibili mantengono il tipo originale sottostante per tornare al tipo di dati originale.

+0

Ad esempio, https://play.golang.org/p/KGTz2WscGY In che modo il meccanismo di riflessione ottiene le informazioni di allineamento del tipo di uint? –

Problemi correlati