2017-05-11 19 views
0

の異なるタイプの値を返す私はいくつかの類似した質問(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": "[email protected]"}`) 
    unmarshal_b := UnmarshalB(b) 
    fmt.Println(unmarshal_b.Name) 
} 

// aaaa 
// bbbb 

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

+2

それはすでに簡単です。 – zerkms

+0

関数UnmarshalAとUnmarshalBで繰り返しが発生したようです。 –

+1

私はそれはあなたが探していた答えではない知っているが、それはまったく 'UnmarshalA'と' UnmarshalB'機能を持たないように私には単純なようだ:https://play.golang.org/p/7zY9MW1JpC –

答えて

1

あなたはオプションのカップルを持っています。

  1. UnmarshalAUnmarshalBを使用しないでください。彼らは本当に多くをやっていないし、あなたが本当に唯一の単一ラインを抽象化している ... var t *A

  2. あなたが実際にAB構造体を必要とし、単純にJSON文字列の内容が示されたくない場合あなたがそれを使うことができる方法では、あなたはmap[string]interface{}に非マーシャルすることができます。

たとえば、

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": "[email protected]"}`) 
    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": "[email protected]"}`) 
    unmarshal_b := UnmarshalAny(b) 

    // Accessed like this... 
    fmt.Println((*unmarshal_a)["name"]) 
    fmt.Println((*unmarshal_b)["name"]) 
} 

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

+0

AとBの構造体が必要な場合、私のコードは正しいですか? それ以外のものは単純にコードを書くことができますか? –

+0

私はよく分かりませんが、ジェネリックスが必要な場合や 'go generate'が必要な場合があります。 –

+0

AとBの構造体が必要な場合は、「1。私の答えでは。私はジェネリックスが構造体がインスタンス化された後にそのようなことが起こるように、あなたを助けるために何かをすることは確実ではありません。さらに、私はこの時点でジェネリックをサポートしているとは思っていません。 –