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

Encoding 如何在golang使用gob发送地图?,encoding,go,tcp,gob,Encoding,Go,Tcp,Gob,在我的用例中,我想从golang的客户机向服务器发送一个映射。我正在使用gob包对对象进行编码和解码。在服务器端,我无法解码该对象 服务器: package main import ( "encoding/gob" "fmt" "net" "github.com/howti/ratelimit" ) var throttleBucket map[string]*ratelimit.Bucket func handleConne

在我的用例中,我想从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
        }
}
start
Received : map[]
客户:

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")
}
有人能帮我吗

围棋版本:1.5 样本输出: 客户:

服务器:

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
        }
}
start
Received : map[]

下面是一个示例,说明如何使用gob对地图进行编码并从中解码()


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

实际上,它返回的是
gob:type ratelimit。Bucket没有导出字段(
) 您也没有处理
server.go
中的
dec.Decode(&throttleBucket)
中的错误。它返回
EOF
,因为没有向服务器发送任何内容


也许您应该阅读更多关于Go约定的内容。

这可能是您没有处理的错误。
dec.Decode(&throttleBucket)
除了错误检查问题之外,请注意,您正在解码/编码到全局映射,这意味着您的应用程序在同时从两个或多个连接写入映射时,可能会损坏其自身的状态。@elithrar-我完全同意您的看法。我刚刚和一个客户进行了测试。我将此代码用于测试目的。一旦我成功了,我将把它整合到我的应用程序代码中。我找不到否决投票的理由。如果您这样做,请说明原因。事实上,这并没有迫使我处理返回类型错误[至少强制使用
.
]。在戈朗的大多数情况下都是这样。我同意,我本可以通过处理错误来发现这一点。我感谢你的帮助。