2017-06-07 63 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

我認爲實現掃描器(甚至是你自己的)比較困難,例如當struct有一個'string'成員時,因爲'(S)printf'不會轉義該值。作爲一個例子,'struct {s string} {「f:3」}將被打印爲'{s:f:3}',這與'struct {s字符串的打印版本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