2011-02-08 10 views
5

Ho letto le esercitazioni Go and Go efficaci e alcune fonti, ma il meccanismo esatto dietro la sintassi interface {} è Go è in qualche modo misterioso per me. L'ho visto per la prima volta quando ho provato ad implementare heap.Interface e sembra essere un contenitore di qualche tipo (mi ricorda una monade un po ') da cui posso estrarre valori di tipo arbitrario.Qual è il ruolo della sintassi "interface {}" in Go?

Perché è stato scritto per utilizzare questo? È una sorta di soluzione alternativa per i generici? C'è un modo più elegante per ottenere valori da un heap.Interface piuttosto che doverli rinominarli con heap.Pop(&h).(*Foo) (nel caso di indicatori di heap per digitare Foo)?

risposta

7

interface{} è una casella generica che può contenere tutto. Le interfacce in go definiscono un insieme di metodi e qualsiasi tipo che implementa questi metodi è conforme all'interfaccia. interface{} non definisce alcun metodo e quindi, per definizione, ogni singolo tipo è conforme a questa interfaccia e pertanto può essere contenuto in un valore di tipo interface{}.

Non è proprio come i farmaci generici. Invece, è un modo per rilassare il sistema dei tipi e dire "qualsiasi valore può essere passato qui". L'equivalente in C per questa funzionalità è un puntatore void *, tranne che in Go è possibile eseguire una query sul tipo di valore trattenuto.

+0

Ah, è un tipo anonimo! Capito. Grazie! Credo che userei qualche tipo di riflessione per interrogare il tipo tenuto. Non ho ancora lavorato con quella parte; finora ho usato la sintassi '' (oddly to me) '. ()' per recuperare i valori. –

+0

C'è un pacchetto reflect che può permetterti di interrogare il tipo, oppure puoi usare un interruttore di tipo, che assomiglia ad un normale switch ma i casi sono tipi. Oppure puoi semplicemente usare la versione non errante di un asserzione di tipo (ad esempio 'value, ok: = foo. (Type)') –

1

Ecco un eccellente blog post che spiega cosa sta succedendo sotto il cofano.

Problemi correlati