不同类型的相同方法,并在Go中返回不同的类型值

时间:2017-05-11 08:12:25

标签: go

我看过一些类似的问题(Same method on different array types in Go

但在我的情况下,我的函数不会返回相同的类型。

您能更简单地编写以下代码吗?

package main

import (
  "encoding/json"
  "fmt"
)

type A struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}

type B struct {
  Name    string `json:"name"`
  Age     int    `json:"age"`
  Address string `json:address`
}

func UnmarshalA(b []byte) *A {
  var t *A
  _ = json.Unmarshal(b, &t)
  return t
}

func UnmarshalB(b []byte) *B {
  var t *B
  _ = json.Unmarshal(b, &t)
  return t
}

func main() {
  a := []byte(`{"name": "aaaa", "age": 1}`)
  unmarshal_a := UnmarshalA(a)
  fmt.Println(unmarshal_a.Name)

  b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
  unmarshal_b := UnmarshalB(b)
  fmt.Println(unmarshal_b.Name)
}

// aaaa
// bbbb

https://play.golang.org/p/PF0UgkbSvk

1 个答案:

答案 0 :(得分:1)

你有几个选择。

  1. 请勿使用UnmarshalAUnmarshalB。 他们真的没有做太多事情,你真的只是抽出一条线...... var t *A

  2. 如果您实际上不需要AB结构,并且只想以您可以使用它的方式表示JSON字符串的内容,那么您可以将其解组为map[string]interface{}

  3. E.g。

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    func UnmarshalAny(b []byte) map[string]interface{} {
        var t = make(map[string]interface{})
        _ = json.Unmarshal(b, &t)
        return t
    }
    
    func main() {
        a := []byte(`{"name": "aaaa", "age": 1}`)
        unmarshal_a := UnmarshalAny(a)
    
        b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
        unmarshal_b := UnmarshalAny(b)
    
        // Accessed like this...
        fmt.Println(unmarshal_a["name"])
        fmt.Println(unmarshal_b["name"])
    }
    

    https://play.golang.org/p/KaxBlNsCDR

    如果您想通过引用传递数据,那么您可以将其更改为以下内容:

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    func UnmarshalAny(b []byte) *map[string]interface{} {
        var t = make(map[string]interface{})
        _ = json.Unmarshal(b, &t)
        return &t
    }
    
    func main() {
        a := []byte(`{"name": "aaaa", "age": 1}`)
        unmarshal_a := UnmarshalAny(a)
    
        b := []byte(`{"name": "bbbb", "age": 2, "address": "b@example.com"}`)
        unmarshal_b := UnmarshalAny(b)
    
        // Accessed like this...
        fmt.Println((*unmarshal_a)["name"])
        fmt.Println((*unmarshal_b)["name"])
    }
    

    https://play.golang.org/p/AXKYCCMJQU