2015-09-01 7 views
5

Sto scrivendo una funzione che analizza un file JSON di configurazione e utilizza json.Unmarshal memorizza i suoi dati in una struttura. Ho fatto qualche ricerca e ho ottenuto il punto in cui ho una struttura Config e una struct Server_Config come un campo in config per permettermi di aggiungere più campi in quanto voglio diverse strutture di configurazione.Come scrivere una funzione Vai per accettare diverse strutture?

Come posso scrivere una funzione parseJSON per lavorare con diversi tipi di strutture?

Codice:

Server.go

type Server_Config struct { 
    html_templates string 
} 

type Config struct { 
    Server_Config 
} 

func main() { 
    config := Config{} 
    ParseJSON("server_config.json", &config) 
    fmt.Printf("%T\n", config.html_templates) 
    fmt.Printf(config.html_templates) 
} 

config.go

package main 
import(
    "encoding/json" 
    "io/ioutil" 
    "log" 
) 

func ParseJSON(file string, config Config) { 
    configFile, err := ioutil.ReadFile(file) 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = json.Unmarshal(configFile, &config) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

o se c'è un modo migliore per fare tutto questo me lo faccia sapere che, come bene. Piuttosto nuovo da fare e ho le convenzioni Java scolpite nel mio cervello.

risposta

6

Uso interface{}:

func ParseJSON(file string, val interface{}) { 
    configFile, err := ioutil.ReadFile(file) 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = json.Unmarshal(configFile, val) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

Chiamando la funzione è la stessa.

+0

Oh fantastico. Quindi, perché/come funziona? – mbridges

+1

'interface {}' è la cosa più vicina a un tipo generico che si ottiene in Go, è possibile passare qualsiasi tipo utilizzandolo, json quindi usa ['reflect'] (http://golang.org/pkg/reflect/) per gestirlo. – OneOfOne