存储Go编码数据的通用函数

时间:2013-12-01 23:11:55

标签: go

我需要编写一个通用函数,它可以将对象存储为gobjects。

func hash_store(data map[string]string) {
  //initialize a *bytes.Buffer
  m := new(bytes.Buffer) 
  //the *bytes.Buffer satisfies the io.Writer interface and can
  //be used in gob.NewEncoder() 
  enc := gob.NewEncoder(m)
  //gob.Encoder has method Encode that accepts data items as parameter
  enc.Encode(data)
  //the bytes.Buffer type has method Bytes() that returns type []byte, 
  //and can be used as a parameter in ioutil.WriteFile() 
  err := ioutil.WriteFile("dep_data", m.Bytes(), 0600) 
  if err != nil {
          panic(err)
  }
  fmt.Printf("just saved all depinfo with %v\n", data)

  n,err := ioutil.ReadFile("dep_data")
        if err != nil {
                fmt.Printf("cannot read file")
                panic(err)
        } 
        //create a bytes.Buffer type with n, type []byte
        p := bytes.NewBuffer(n) 
        //bytes.Buffer satisfies the interface for io.Writer and can be used
        //in gob.NewDecoder() 
        dec := gob.NewDecoder(p)
        //make a map reference type that we'll populate with the decoded gob 
        //e := make(map[int]string)
         e := make(map[string]string)
        //we must decode into a pointer, so we'll take the address of e 
        err = dec.Decode(&e)
        if err != nil {
                fmt.Printf("cannot decode")
                panic(err)
        }

        fmt.Println("after reading dep_data printing ",e)
}

在这个函数中,我知道要存储在map [string]字符串中的数据类型。但我需要编写一个通用函数,我不知道数据类型,仍然将它存储为文件中的gobject。

2 个答案:

答案 0 :(得分:4)

将具体类型(map[string]string)更改为空接口类型(interface{})。 请参阅this related question为何有效。

编码:

func store(data interface{}) {
  m := new(bytes.Buffer) 
  enc := gob.NewEncoder(m)

  err := enc.Encode(data)
  if err != nil { panic(err) }

  err = ioutil.WriteFile("dep_data", m.Bytes(), 0600) 
  if err != nil { panic(err) }
}

解码:

func load(e interface{}) {
    n,err := ioutil.ReadFile("dep_data")
    if err != nil { panic(err) } 

    p := bytes.NewBuffer(n) 
    dec := gob.NewDecoder(p)

    err = dec.Decode(e)
    if err != nil { panic(err) }
}

您放入load的值必须是使用gob存储在文件中的类型的指针。

map[string]string的示例:

org := map[string]string{"foo": "bar"}
store(org)

var loadedMap map[string]string
load(&loadedMap)

fmt.Println(loadedMap["foo"]) // bar

答案 1 :(得分:0)

编码数据时,给编码器a *接口{},然后用* interface {}

解码
var to_enc interface{} = ...;
god.NewEncoder(...).Encode(&to_enc);
...
var to_dec interface{}
god.NewDecoder(...).Decode(&to_dec);