如何在golang中使用gob发送地图?
How to send map using gob in golang?
在我的用例中,我想用 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[]
这是一个示例,您可以如何使用 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)
}
问题是您没有在 client.go
中处理 encoder.Encode(&throttleBucket)
的错误 return。
实际上,它 returns gob: type ratelimit.Bucket has no exported fields
.(why?)
而且您也没有在 server.go
中处理来自 dec.Decode(&throttleBucket)
的错误。它 returns EOF
因为没有向服务器发送任何内容。
也许你应该在 Go 约定中阅读更多关于 error 的内容。
在我的用例中,我想用 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[]
这是一个示例,您可以如何使用 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)
}
问题是您没有在 client.go
中处理 encoder.Encode(&throttleBucket)
的错误 return。
实际上,它 returns gob: type ratelimit.Bucket has no exported fields
.(why?)
而且您也没有在 server.go
中处理来自 dec.Decode(&throttleBucket)
的错误。它 returns EOF
因为没有向服务器发送任何内容。
也许你应该在 Go 约定中阅读更多关于 error 的内容。