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

在我的用例中,我想从 golang 客户端向服务器发送地图。我正在使用 gob 包对对象进行编码和解码。在服务器端,我无法解码对象。


服务器:


package main


import (

        "encoding/gob"

        "fmt"

        "net"

        "github.com/howti/ratelimit"

)


var throttleBucket map[string]*ratelimit.Bucket


func 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 main


import (

        "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 client

Map before sending  &map[127.0.0.1:0x1053c640 127.0.4.1:0x1053c680]

done

服务器:


start

Received : map[]


MM们
浏览 184回答 2
2回答

隔江千里

问题是您没有处理encoder.Encode(&throttleBucket)in返回的错误 client.go。实际上,它返回gob: type ratelimit.Bucket has no exported fields.(为什么? ) 而且您也没有处理dec.Decode(&throttleBucket)in 中的错误server.go。它返回EOF是因为没有向服务器发送任何内容。也许你应该在 Go 约定中阅读更多关于错误的信息。

慕丝7291255

这是一个示例,如何使用 gob 对地图进行编码并从中解码 ( go playground)package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go