簡體   English   中英

如何創建通用函數以解組所有類型?

[英]How to create a generic function to unmarshal all types?

我下面有一個函數,我想使其泛型:

func genericUnmarshalForType1(file string) Type1 {

  raw, err := ioutil.ReadFile(file)

  if err != nil {
      fmt.Println(err.Error())
      os.Exit(1)
  }

  var type1 Type1

  json.Unmarshal(raw, &type1)
}

我想創建一個接受Type1或Type2的函數,而無需為每個類型創建一個函數。 我怎樣才能做到這一點?

以與json.Unmarshal相同的方式json.Unmarshal操作:

func genericUnmarshal(file string, v interface{}) {
    // File emulation.
    raw := []byte(`{"a":42,"b":"foo"}`)
    json.Unmarshal(raw, v)
}

游樂場: http : //play.golang.org/p/iO-cbK50BE

通過實際返回遇到的任何錯誤,可以使此功能更好。

Go不支持泛型,但是您可以編寫如下代碼:

func genericUnmarshalForType1(file string) interface{} {

    raw, err := ioutil.ReadFile(file)

    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    var x interface{}
    if err = json.NewDecoder(raw).Decode(x); err != nil {
        return nil
    }

    return x
}

func main() {
    x := genericUnmarshalForType1("filename.json");

    var t1 Type1
    var t2 Type2

    switch t := x.(type) {
    case Type1:
        t1 = t
    case Type2:
        t2 = t
    }
}

此外,我建議你閱讀http://attilaolah.eu/2013/11/29/json-decoding-in-go/有關Unmarshal使用和數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM