在Go中写到客户的UDP套接字
我正在寻找使用GO语言使用UDP插座的客户/服务器通信的好解决方案. 我在Internet上找到的示例向我展示了如何将数据发送到服务器,但他们没有教导如何将它们发送回客户. 演示,我的程序执行以下操作: 我的客户端程序在4444端口上创建一个套接字,因此: con, err := net.Dial("udp", "127.0.0.1:4444") 我向服务器发送了一个字符串和本地地址,因此它可以打印字符串并发送确定消息.我正在使用GOB: enc := gob.NewEncoder(con) enc.Encode(Data{"test", con.LocalAddr().String()}) 我的数据结构看起来像这样: type Data struct{ Msg string Addr string } 我的服务器会听到4444端口并正确解码GOB,但是如何将确定消息发送回?我正在使用客户端地址(在服务器.go文件上):
4 2023-11-02
编程技术问答社区
在Go编程中无法通过TCP发送gob数据
我有一个客户端服务器应用程序,使用TCP Connection 客户端: type Q struct { sum int64 } type P struct { M, N int64 } func main() { ... //read M and N ... tcpAddr, err := net.ResolveTCPAddr("tcp4", service) ... var p P p.M = M p.N = N err = enc.Encode(p) } 服务器: type Q struct { sum int64 } type P struct { M, N int64 } func main() { ... tcpAddr, err := net.ResolveTCPAddr("ip4", service) listene
10 2023-10-15
编程技术问答社区
高效的Go序列化结构到磁盘
我被任命替换C ++代码要进行,我是GO API的新手.我正在使用GOB编码数百个键/值条目到磁盘页面,但是GOB编码的膨胀太多,而不需要. package main import ( "bytes" "encoding/gob" "fmt" ) type Entry struct { Key string Val string } func main() { var buf bytes.Buffer enc := gob.NewEncoder(&buf) e := Entry { "k1", "v1" } enc.Encode(e) fmt.Println(buf.Bytes()) } 这会产生很多我不需要的膨胀: [35 255 129 3 1 1 5 69 110 116 114 121 1 255 130 0 1 2 1 3 75 101 121 1 12 0 1 3 86 97
10 2023-10-03
编程技术问答社区
字符串的编码/解码在Gob中进行
我遵循 https://blog.golang.org/gob/gob 链接.并编写了一个示例,其中结构具有所有字符串数据. 这是我的样本: package main import ( "bytes" "encoding/gob" "fmt" "log" ) type P struct { X string a string Name string } type Q struct { X string a string Name string } func main() { // Initialize the encoder and decoder. Normally enc and dec would be // bound to network connections and the encoder and decoder would // run in
16 2023-04-26
编程技术问答社区
gob恐慌地解码一个接口
我有一个带有未出现字段的结构,该结构应被编码和解码. 说: type A struct { s int } func (a *A) Inc() { a.s++ } 显然,在这种情况下,我需要实现gob.GobEncoder和gob.GobDecoder接口. 如果我直接使用结构,一切正常: https://play.golang.org.org/p/dm3hwwai8eu ,但我还需要具有实现相同逻辑并且可序列化的接口: type Incer interface { gob.GobEncoder gob.GobDecoder Inc() } 完整代码: https://play.golang.org.org/p/zig2mprnrq p> 突然感到恐慌: panic: interface conversion: interface is nil, not gob.GobDecoder [recovered]
40 2023-04-19
编程技术问答社区
编码/gob和编码/json的区别
我正在GO中编写一个应用程序,该应用程序使用编码/GOB在节点之间的UDP上发送结构和切片.它可以正常工作,但我注意到编码/JSON也具有类似的API.搜索并找到了此信息( https://golang.org/pkg/pkg/encoding/): GOB软件包GOB管理GOB的流 - 交换的二进制值 在编码器(发射器)和解码器(接收器)之间. JSON软件包JSON实现了JSON的编码和解码 RFC 4627. 有人可以向我解释一个人是否比另一个更有效,并且一般可以选择何时选择什么?另外,如果我需要与非Go应用程序进行交互,我想JSON是首选的? 解决方案 在GO程序之间进行交流时,GOB更受欢迎.但是,目前仅在GO中支持GOB, c 当您确定没有其他任何编程语言编写的程序时,请使用它. 在性能方面,至少在我的机器上,GOB远远超出了JSON. test File $ go test -bench=. testing: warning:
52 2023-02-18
编程技术问答社区
在golang中深拷贝对象的快速方法,JSON与Gob的关系
我正在使用go 1.9.我想将对象的深度值置于另一个对象.我尝试使用编码/GOB和编码/JSON进行操作.但是,与JSON编码相比,GOB编码需要更多的时间.我看到了其他一些问题,例如 this ,他们建议GOB编码应该更快.但是我看到完全相反的行为.有人可以告诉我我是否做错了什么?还是比这两个更好,更快的方法?我的对象的结构很复杂且嵌套. 测试代码: package main import ( "bytes" "encoding/gob" "encoding/json" "log" "time" "strconv" ) // Test ... type Test struct { Prop1 int Prop2 string } // Clone deep-copies a to b func Clone(a, b interface{}) { buff := new(bytes.Buffer
28 2023-02-17
编程技术问答社区
Gob不能用空指针值对地图进行编码
GOB的编码在我尝试编码映射以指示的情况下,如果其中一个值为nil,则会返回错误.这似乎与文档相矛盾(但我可能误解了含义): 在切片和阵列以及地图,所有元素,甚至是零值元素都被传输,即使所有元素均为零. 代码: package main import ( "bytes" "encoding/gob" ) type Dog struct { Name string } func main() { m0 := make(map[string]*Dog) m0["apple"] = nil // Encode m0 to bytes var network bytes.Buffer enc := gob.NewEncoder(&network) err := enc.Encode(m0) if err != nil { panic(err) // Output: panic
26 2022-10-15
编程技术问答社区
在不知道具体类型的情况下,解码暴徒的输出
我正在使用GOB将结构序列化为磁盘.所讨论的结构包含一个接口字段,因此需要使用gob.Register(...). 注册混凝土类型 这里的皱纹是,进行GOB-ing的库应该不知道使用的混凝土类型.我希望即使呼叫者定义了自己的接口实现,我也希望序列化. 我可以通过即时注册类型(请参阅下面的琐事示例)成功编码数据,但是在尝试重新阅读该数据后,GOB拒绝接受未注册的类型.令人沮丧的是,因为感觉就像所有数据都在那里 - 为什么GOB不只是将其标记为main.UpperCaseTransformation struct的包装? package main import ( "encoding/gob" "fmt" "os" "strings" ) type Transformation interface { Transform(s string) string } type TextTransformation struct {
38 2022-10-15
编程技术问答社区
使用gob来包装递归定义的结构
我主要使用python,但是正在玩耍.我写了以下内容来做python中非常简单的事情,我希望它也可以在旅途中完成. package main import ( "bytes" "encoding/gob" "fmt" "io/ioutil" ) type Order struct { Text string User *User } type User struct { Text string Order *Order } func main() { o := Order{} u := User{} o.Text = "order text" u.Text = "user text" // commenting this section prevents stack overflow o.User = &u u.Order = &o fmt.P
26 2022-10-15
编程技术问答社区
将地图的键值/值存储在一个持久性文件中
我将或多或少地创建一个形式: type FileState struct { LastModified int64 Hash string Path string } 我想将这些值写入文件并在后续呼叫中读取它们.我的最初计划是使用键(路径)将它们读成地图和查找值(哈希和最后修饰).有没有一种光滑的方式? 如果没有,您可以推荐什么文件格式?我已经阅读并尝试了以前项目中的一些密钥/值文件存储,但不使用GO.目前,我的要求可能很简单,因此大型数据库服务器系统将过于杀伤.我只想要一些可以写入并从快速,轻松,便宜的东西(Windows,Mac,Linux).因为我必须在多个平台上部署,所以我试图将我的非依赖性保持在最低限度. 我已经考虑了XML,CSV,JSON.我在Go中简要看了GOB包,并注意到GO软件包仪表板上的BSON包,但我不确定是否适用. 我的主要目标是快速起床并运行,这意味着我需要写的最少的代码以及易于部署. 解决方案 只要
20 2022-10-14
编程技术问答社区
附加到磁盘上的文件中的golang gob
我试图将gob编码的数据保存在磁盘上的文件中,作为简单的数据存储.但是,当我下次打开它时,GOB编码器只是忽略了文件中的所有数据,然后开始在发送数据之前发送已发送格式的定义.看到gob.Encoder占用io.Writer,而不是io.ReadWriter,这是有道理的.编码器不知道文件中有什么,因为它无法从中读取. 但是,这效率很低.它也很难解析,因为您必须每次编码时重新启动到文件时重新启动解码器,因为GOB类型ID可能已更改. . 如何继续写入包含GOB数据的文件的末尾?我是否必须创建一个新文件,将所有数据转移到上面,以便GOB编码器知道它已经发送了哪种类型,或者有办法告诉编码器它应该知道哪些类型或其他方式?我需要它可以跨软件重新启动. 解决方案 不可能与其他编码器编写GOB值流相关的状态重建编码器.如果您在附加值时无法使用原始编码器,则有几个选项: 按照您的建议,将数据转移到. 使用框架机制将多个GOB流存储到单个文件中.例如,您可以将每个GOB流的前
18 2022-10-14
编程技术问答社区
gob: 未注册的接口类型:map[string]interface {}。
gob无法编码map[string]interface{} gob: type not registered for interface: map[string]interface {} http://play.golang.org/p/si4hd8ii0je package main import ( "bytes" "encoding/gob" "encoding/json" "fmt" "log" ) func CloneObject(a, b interface{}) []byte { buff := new(bytes.Buffer) enc := gob.NewEncoder(buff) dec := gob.NewDecoder(buff) err := enc.Encode(a) if err != nil { log.Panic("e1: ", err)
122 2022-10-14
编程技术问答社区
编码/Gob是确定性的吗?
我们可以期望两个go对象x,y,这样x等于y(假设界面和地图没有棘手,只是结构和数组),gob_encode(x)和gob_encode的输出将始终是相同? 编辑(2018年6月8日): GOB编码是非确定性当地图涉及时.这是由于地图的随机迭代顺序,导致其序列化被随机排序. 解决方案 只要"完成工作",您就不应该真正在乎.但是当前的以来: gobs流是自我描述的.流中的每个数据项均在其类型的规范之前,以一小部分预定义的类型表示. 这意味着,如果您第一次编码类型的值,则将发送类型信息.如果您对同一类型的另一个值进行编码,则类型说明将不会再次传输,只是对其先前规格的引用.因此,即使您两次编码相同的值,它也会产生不同的字节序列,因为第一个序列将包含类型规格和值,第二个将仅包含类型REF(例如类型ID)和值. . 请参阅此示例: type Int struct{ X int } b := &bytes.Buffer{} e := gob.NewEnco
64 2022-10-14
编程技术问答社区
在golang中快速复制对象
我正在使用 go 1.9.我想将对象的值深度复制到另一个对象中.我尝试使用 encoding/gob 和 encoding/json 来做到这一点.但是gob编码比json编码需要更多的时间.我看到了一些其他问题,例如 this 他们建议gob 编码应该更快.但我看到完全相反的行为.有人可以告诉我我做错了什么吗?还是有比这两种更好更快的深度复制方法?我的对象结构复杂且嵌套. 测试代码: package main import ( "bytes" "encoding/gob" "encoding/json" "log" "time" "strconv" ) // Test ... type Test struct { Prop1 int Prop2 string } // Clone deep-copies a to b func Clone(a, b interface{}) { buff := n
1798 2022-07-19
编程技术问答社区
golang中编码/gob和编码/json的区别
我正在 GO 中编写一个应用程序,它使用 encoding/gob 在节点之间通过 UDP 发送结构和切片.它工作正常,但我注意到 encoding/json 也有类似的 API.搜索了一下,找到了这个信息(https://golang.org/pkg/encoding/):p> gob 包 gob 管理 gob 流 - 交换的二进制值编码器(发送器)和解码器(接收器)之间. json 包 json 实现了 JSON 的编码和解码,定义在RFC 4627. 有人可以向我解释一个是否比另一个更有效,并且一般比较何时选择什么?另外,如果我需要与非 golang 应用程序交互,我猜 json 会是首选? 解决方案 在 Go 程序之间进行通信时,更倾向于使用 Gob.但是,gob 目前仅在 Go 和 C 中受支持,所以只有当您确定没有任何其他编程语言编写的程序会尝试解码这些值时,请使用它. 在性能方面,至少在我的机器上,Gob 远胜 JSON.测试文件(单独放在您的 GO
1354 2022-07-17
编程技术问答社区