2015-09-01 4 views
5

Ich schreibe eine Funktion, die eine Konfig JSON-Datei analysiert und json.Unmarshal speichert seine Daten in einer Struktur. Ich habe einige Nachforschungen angestellt, und es hat mir den Punkt gebracht, an dem ich eine Config-Struktur und eine Server_Config-Struktur als Feld in der Konfiguration habe, damit ich mehr Felder hinzufügen kann, wenn ich verschiedene konfigurationsähnliche Strukturen möchte.Wie schreibe ich eine Go-Funktion, um verschiedene Strukturen zu akzeptieren?

Wie kann ich eine parseJSON-Funktion schreiben, um für verschiedene Arten von Strukturen zu arbeiten?

Code:

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) 
    } 
} 

Oder wenn es einen besseren Weg, um all dies zu tun ist, lassen Sie mich wissen, dass als Gut. Ziemlich neu in Go und ich habe Java Konventionen in mein Gehirn geschnitzt.

Antwort

6

Verwendung 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) 
    } 
} 

Funktion aufrufen ist die gleiche.

+0

Oh großartig. Also warum/wie geht das? – mbridges

+1

'Schnittstelle {}' ist die nächste Sache zu einem generischen Typ, den Sie in Go bekommen werden, Sie können jeden beliebigen Typ übergeben, json verwendet dann ['reflect] (http://golang.org/pkg/reflect/) damit umzugehen. – OneOfOne

Verwandte Themen