2017-06-07 11 views
0

私は以前にfmt.Sprintf("%+v", d)dというデータがstructインスタンスであることがあります。それをスキャンする方法はありますか?下にfmt.Sscanf()を使用して私の素朴な試みは失敗しています(Go Playground)。構造体のfmt.Sscanf

package main 

import (
    "fmt" 
) 

type data struct { 
    f int 
} 

func main() { 
    x := data{1} 
    s := fmt.Sprintf("%+v", x) 
    var y data 
    n, err := fmt.Sscanf(s, "%+v", &y) 
    fmt.Printf("s=%s, n=%d, err=%+v, y=%+v\n", s, n, err, y) 
} 

出力は次のようになります。

s={f:1}, n=0, err=can't scan type: *main.data, y={f:0} 

は、構造体の背面をスキャンする方法はありますか?

+0

'(S)printf'が値をエスケープしないので、構造体が' string'メンバを持っているときなど、スキャナを実装するのは非常に難しいと思います。例として 'struct {s string} {" f:3 "}'は '{s:f:3}'として出力されます。これは 'struct {s string、f int} {""、3} '(分かりやすくするために' struct'にカンマが追加されています)。 – putu

答えて

1

残念ながら、fmtパッケージは厳密に解析可能な出力を生成しません。ありがたいことに、データをマーシャリングするための他のパッケージもあります。これは、使いやすいものでなければなりません。

私は、単純な何かのためにjsonをお勧めします:

s, err := json.Marshal(data) 
// Check err 
err = json.Unmarshal(s, data) 

jsonはprintf関数に似ていた出力を生成し、それを解析することができますが保証規格に準拠します。あなたの目標がPrintfのフォームにしか存在しないデータを解析することになっているのであれば、運が悪いかもしれません。

+0

確かに、jsonが私の最初の選択でしたが、その部分はやや性能に敏感なので、私は['gob'](https://golang.org/pkg/encoding/gob/)を使ってしまいました。 – bereal