2015-09-01 4 views
5

मैं एक ऐसा फ़ंक्शन लिख रहा हूं जो एक कॉन्फ़िगर JSON फ़ाइल को पार्स करता है और json का उपयोग करता है। Unmarshal एक स्ट्रक्चर में अपना डेटा संग्रहीत करता है। मैंने कुछ शोध किया है और यह मुझे उस बिंदु पर प्राप्त कर लिया है जहां मेरे पास कॉन्फ़िगरेशन में एक फ़ील्ड के रूप में एक कॉन्फ़िगरेशन स्ट्रक्चर और एक सर्वर_Config संरचना है, जिससे मुझे अधिक फ़ील्ड जोड़ने की अनुमति मिलती है क्योंकि मैं अलग-अलग कॉन्फ़िगर-जैसे structs चाहता हूं।विभिन्न structs स्वीकार करने के लिए एक गो फंक्शन कैसे लिखें?

मैं विभिन्न प्रकार के structs के लिए काम करने के लिए एक parseJSON फ़ंक्शन कैसे लिख सकता हूं?

कोड:

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

या यदि वहाँ ऐसा करने के लिए एक बेहतर तरीका है यह सब मुझे के रूप में है कि पता है कुंआ। जाने के लिए बहुत नया और मेरे पास मेरे दिमाग में नक्काशीदार जावा सम्मेलन हैं।

उत्तर

6

उपयोग 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) 
    } 
} 

समारोह कॉलिंग एक ही है।

+0

ओह कमाल। तो यह क्यों काम करता है? – mbridges

+1

'इंटरफ़ेस {}' एक सामान्य प्रकार के निकटतम चीज है जिसे आप गो में प्राप्त करेंगे, आप इसका उपयोग करके किसी भी प्रकार को पास कर सकते हैं, जेसन तब ['reflect'] का उपयोग करता है (http://golang.org/pkg/reflect/) इसे संभालने के लिए। – OneOfOne

संबंधित मुद्दे