草庐IT

gob 编码到/从 *os.File 解码不工作

coder 2024-07-12 原文

当我使用文件指针时 f *os.File 我得到一个空映射

func decode(f *os.File, b map[string]interface{}) error {
    err := gob.NewDecoder(f).Decode(&b)
    fmt.Printf("%+v\n", b)
    return err
}

func encode(f *os.File, b map[string]interface{}) error {
    bb := map[string]interface{}{
        "X":        1,
        "Greeting": "hello",
    }
    err := gob.NewEncoder(f).Encode(bb)
    f.Sync()
    //fmt.Println(buf.Bytes())
    return err
}

打印 map[]

如果我将其替换为全局缓冲区指针 buf *bytes.Buffer 它会起作用

func decode(f *os.File, b map[string]interface{}) error {
    err := gob.NewDecoder(buf).Decode(&b)
    fmt.Printf("%+v\n", b)
    return err
}

func encode(f *os.File, b map[string]interface{}) error {
    bb := map[string]interface{}{
        "X":        1,
        "Greeting": "hello",
    }
    err := gob.NewEncoder(buf).Encode(bb)
    return err
}

打印 map[Greeting:hello X:1]

f在main中是这样打开的

var (
    buf      *bytes.Buffer
    f       *os.File
    memcache map[string]interface{}        
)

func main() {
    var err error
    f, err = os.Create("_memcache.txt")
    if err != nil {
        log.Print(err.Error())
    }
    defer f.Close() 

    memcache = make(map[string]interface{})
    buf = new(bytes.Buffer)
    gob.Register(map[string]interface{}{})
    err = write()
    if err != nil {
       log.Print(err.Error())
    }
    err = read()
    if err != nil {
        log.Print(err.Error())
    }
}

func read() (err error) {
    err = decode(f, memcache)
    if err != nil && err != io.EOF {
        return err
    }
}

func write() (err error) {
    err = encode(f, memcache)
    if err != nil {
        return err
    }
 }

最佳答案

解决办法已经在评论中提到了,所以更新方法main()如下:

func main() {
    var err error
    f, err = os.Create("_memcache.txt")
    if err != nil {
        log.Print(err.Error())
    }
    defer f.Close()

    memcache = make(map[string]interface{})
    buf = new(bytes.Buffer)
    gob.Register(map[string]interface{}{})

    err = write()
    if err != nil {
        log.Print(err.Error())
    }

    // after write the file pointer is at the end of the file,
    // so it should be moved:      
    f.Seek(0, 0)

    // alternatively, open the file in read()
    err = read()
    if err != nil {
        log.Print(err.Error())
    }
}

关于gob 编码到/从 *os.File 解码不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480167/

有关gob 编码到/从 *os.File 解码不工作的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  10. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

随机推荐