2015-09-01 15 views
5

Bir yapılandırma JSON dosyasını ayrıştıran ve json.Unmarshal öğesinin verilerini bir yapıda depolayan bir işlev yazıyorum. Bazı araştırmalar yaptım ve yapılandırma yapısını ve yapılandırmaya benzer yapıları istediğim gibi daha fazla alan eklememe izin verecek şekilde yapılandırılmış bir alan olarak Server_Config yapısına sahip olduğum nokta bana ulaştı.Farklı yapıları kabul etmek için bir Go işlevi nasıl yazılır?

Farklı yapı türleri için çalışmak üzere bir parseJSON işlevini nasıl yazabilirim?

Kodu:

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

Veya yapmak için daha iyi bir yolu olup olmadığını tüm bu beni bildirmek iyi. Gitmek için oldukça yeni ve beynime oyulmuş Java sözleşmeleri var.

cevap

6

Kullanım 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) 
    } 
} 

fonksiyonunu çağrılması aynıdır.

+0

Harika. Öyleyse neden/nasıl çalışıyor? – mbridges

+1

'Arabirim {}' Go’da alacağınız jenerik tür için en yakın şeydir, bunu kullanarak herhangi bir tür geçirebilirsiniz, json daha sonra ['reflect'] kullanır (http://golang.org/pkg/reflect/) işlemek için. – OneOfOne

İlgili konular