2012-12-14 11 views
5

Ho giocato con go per una settimana e qualcosa che mi manca da C è macro del preprocessore.Macro in stile C in Go

Che cosa potrei usare per ottenere questa funzione, oltre ad aver hackerato uno script di compilazione che passa i file attraverso clang -E?

+2

Penso che manchi una parte della filosofia di Go. Ad esempio l'importanza della chiarezza. –

+1

Ovviamente la chiarezza è importante, ma non penso che ripetere più volte lo stesso codice sia migliore per chiarezza. –

+5

Se si fornisce un esempio di ciò che si sta tentando di realizzare, è probabile che ci sia un modo più "attivo" per farlo. – Chris

risposta

7

Come menzionato nei commenti, i flag di compilazione sono probabilmente il modo migliore per risolvere qualsiasi cosa tu abbia bisogno. Per esempio, se si voleva avere alcune caratteristiche disponibili solo in fase di sviluppo, utilizzare una bandiera dev:

constants_dev.go File:

// +build dev 
const DEVELOPMENT = true 

File constants_pro.go

// +build !dev 
const DEVELOPMENT = false 

Poi, nel tuo codice, basta fare un semplice if DEVELOPMENT { blah... }. Trovo questo molto più leggibile di qualsiasi preprocessore. Questo può diventare piuttosto complicato se hai molti flag di compilazione, ma a quel punto dovresti probabilmente usare gli argomenti della riga di comando.

Nel tuo commento hai menzionato la duplicazione del codice. Se il tuo codice è davvero così ripetitivo, dovresti probabilmente metterlo in una funzione in ogni caso, o eventualmente ristrutturare il codice per riutilizzare i bit ripetitivi. Personalmente, trovo che qualcosa che va oltre i semplici controlli booleani finisca in un codice difficile da mantenere, specialmente con le macro in stile C.

È la stessa cosa con i generici. In una libreria Java che ho usato, la firma di classe era qualcosa di simile:

class Thing<A, B, C, D, E> 

La biblioteca non era molto ben documentato, così ho dovuto leggere una notevole quantità di codice (sia implementazione e il codice che usa la biblioteca) per capire cosa stava succedendo.

In Go, il linguaggio forza uno stile che generalmente porta a un codice migliore e autodocumentante. Penso che gli sviluppatori di Go abbiano omesso cose come un preprocessore e generici per evitare la tentazione di scrivere duro per mantenere, ma un codice intelligente.

Vorrei consigliarti di provare il modo Go prima di guardare indietro ai vecchi idiomi che hai usato prima. Penso che scoprirai che gran parte delle macro e dei #define utilizzate sono in gran parte irrilevanti.

5

Penso che cpp, m4 o qualsiasi altra cosa possa soddisfare il tuo desiderio di avere Go preelaborato. Se è una buona idea o no è una tua decisione, ma tieni presente che qualsiasi pre-elaborazione è un ostacolo sostanziale per l'adozione di qualsiasi codice Go pubblicato. (E per esempio, la build dipende dai makefile è la stessa storia.)