为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中使用gob发送地图?

如何在golang中使用gob发送地图?

Go
MM们 2021-11-22 20:05:59
在我的用例中,我想从 golang 客户端向服务器发送地图。我正在使用 gob 包对对象进行编码和解码。在服务器端,我无法解码对象。服务器:package mainimport (        "encoding/gob"        "fmt"        "net"        "github.com/howti/ratelimit")var throttleBucket map[string]*ratelimit.Bucketfunc handleConnection(conn net.Conn) {        dec := gob.NewDecoder(conn)        dec.Decode(&throttleBucket)        fmt.Printf("Received : %+v", throttleBucket)}func main() {        fmt.Println("start")        ln, err := net.Listen("tcp", ":8082")        if err != nil {                // handle error        }        for {                conn, err := ln.Accept() // this blocks until connection or error                if err != nil {                        // handle error                        continue                }                go handleConnection(conn) // a goroutine handles conn so that the loop can accept other connections        }}和客户:package mainimport (        "encoding/gob"        "fmt"        "log"        "github.com/howti/ratelimit"        "net")var (    throttleBucket = make(map[string]*ratelimit.Bucket))func main() {        fmt.Println("start client")        conn, err := net.Dial("tcp", "localhost:8082")        if err != nil {                log.Fatal("Connection error", err)        }        encoder := gob.NewEncoder(conn)        throttleBucket["127.0.0.1"] = ratelimit.NewBucketWithRate(float64(10), int64(100))        throttleBucket["127.0.4.1"] = ratelimit.NewBucketWithRate(float64(1), int64(10))        fmt.Println("Map before sending ", &throttleBucket)        encoder.Encode(&throttleBucket)        conn.Close()        fmt.Println("done")}有人可以帮我吗?Go 版本:1.5 示例输出:客户端:start clientMap before sending  &map[127.0.0.1:0x1053c640 127.0.4.1:0x1053c680]done服务器:startReceived : map[]
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

问题是您没有处理encoder.Encode(&throttleBucket)in返回的错误 client.go

实际上,它返回gob: type ratelimit.Bucket has no exported fields.(为什么? ) 而且您也没有处理dec.Decode(&throttleBucket)in 中的错误server.go。它返回EOF是因为没有向服务器发送任何内容。

也许你应该在 Go 约定中阅读更多关于错误的信息。


查看完整回答
反对 回复 2021-11-22
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

这是一个示例,如何使用 gob 对地图进行编码并从中解码 ( go playground)


package main


import (

    "fmt"

    "encoding/gob"

    "bytes"

)


var m = map[int]string{1:"one", 2: "two", 3: "three"}


func main() {

    buf := new(bytes.Buffer)

    encoder := gob.NewEncoder(buf)


    err := encoder.Encode(m)

    if err != nil {

        panic(err)

    }


    // your encoded stuff

    fmt.Println(buf.Bytes())


    var decodedMap map[int]string

    decoder := gob.NewDecoder(buf)


    err = decoder.Decode(&decodedMap)

    if err != nil {

        panic(err)

    }


    fmt.Printf("%#v\n", decodedMap)

}


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信