duanci3845 2014-07-01 08:27
浏览 51
已采纳

传递接口指针和赋值

I want to write a file cache in Go. I am using gob encoding, and saving to a file, but my get function has some problem:

package main

import (
    "encoding/gob"
    "fmt"
    "os"
)

var (
    file = "tmp.txt"
)

type Data struct {
    Expire int64
    D      interface{}
}

type User struct {
    Id   int
    Name string
}

func main() {
    user := User{
        Id:   1,
        Name: "lei",
    }
    err := set(file, user, 10)
    if err != nil {
        fmt.Println(err)
        return
    }

    user = User{}
    err = get(file, &user)
    if err != nil {
        fmt.Println(err)
        return
    }

    //user not change.
    fmt.Println(user)

}

func set(file string, v interface{}, expire int64) error {
    f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
    if err != nil {
        return err
    }
    defer f.Close()

    //wrapper data
    //save v in data.D
    data := Data{
        Expire: expire,
        D:      v,
    }
    gob.Register(v)
    enc := gob.NewEncoder(f)
    err = enc.Encode(data)
    if err != nil {
        return err
    }
    return nil
}

func get(file string, v interface{}) error {
    f, err := os.OpenFile(file, os.O_RDONLY, 0600)
    if err != nil {
        return err
    }
    defer f.Close()

    var data Data
    dec := gob.NewDecoder(f)
    err = dec.Decode(&data)
    if err != nil {
        return err
    }

    //get v
    v = data.D
    fmt.Println(v)

    return nil
}

The get function passes interface type and I want to change the value, but not change. http://play.golang.org/p/wV7rBH028o

展开全部

  • 写回答

2条回答 默认 最新

  • doy57007 2014-07-01 09:36
    关注

    An alternative approach is to return directly the value from the file:

    func get(file string) (interface{}, error) {
        f, err := os.OpenFile(file, os.O_RDONLY, 0600)
        if err != nil {
            return nil, err
        }
        defer f.Close()
    
        var data Data
    
        dec := gob.NewDecoder(f)
        err = dec.Decode(&data)
        if err != nil {
            return nil,err
        }
    
        fmt.Println(data.D)
    
        return data.D,nil
    }
    

    full working example: http://play.golang.org/p/178U_LVC5y

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部