2015-09-01 15 views
5

Tôi đang viết một hàm phân tích cú pháp một tệp JSON cấu hình và sử dụng json.Unmarshal lưu trữ dữ liệu của nó trong một cấu trúc. Tôi đã thực hiện một số nghiên cứu và nó đã cho tôi điểm mà tôi có cấu trúc Config và cấu trúc Server_Config làm trường trong cấu hình để cho phép tôi thêm nhiều trường hơn vì tôi muốn cấu hình giống như cấu hình khác.Cách viết hàm Go để chấp nhận các cấu trúc khác nhau?

Làm cách nào để viết một hàm parseJSON để hoạt động cho các loại cấu trúc khác nhau?

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

Hoặc nếu có một cách tốt hơn để làm tất cả điều này cho tôi biết rằng như tốt. Khá mới đối với Go và tôi có các quy ước Java được khắc vào bộ não của tôi.

Trả lời

6

Sử dụng 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) 
    } 
} 

Gọi chức năng là như nhau.

+0

Rất tuyệt. Vậy tại sao/nó hoạt động như thế nào? – mbridges

+1

'interface {}' là điều gần nhất với kiểu generic bạn sẽ nhận được trong Go, bạn có thể chuyển bất kỳ kiểu nào bằng cách sử dụng nó, json sau đó sử dụng ['reflect'] (http://golang.org/pkg/reflect/) để xử lý nó. – OneOfOne

Các vấn đề liên quan