Go-micro v2客户端接收服务端响应失败:形参赋值引发的错误
在使用Go-micro v2构建微服务时,客户端无法接收服务端响应数据的情况时有发生。本文通过一个案例分析,解释这种错误的根本原因并提供解决方案。
问题描述:一个基于Go-micro v2的微服务,其protobuf定义了一个名为response的消息体,包含id和name两个字段。服务端方法hello处理请求并返回response。然而,服务端直接用结构体赋值的方式填充response时,客户端无法接收数据;而逐字段赋值则能正常接收。
代码示例(服务端):
type Say struct{}func (s *Say) Hello(_ context.Context, in *pb.Request, out *pb.Response) error { fmt.Println(in) // 客户端请求数据在此处正常输出 // 错误的赋值方式:客户端无法接收数据 /* out = &pb.Response{ Id: "111", Name: "张三", } */ // 正确的赋值方式:客户端可以接收数据 out.Id = "111" out.Name = "张三" return nil}
登录后复制
错误原因分析:注释掉的赋值语句out = &pb.Response{id: “111”, name: “张三”}并非修改out指针指向内存中的数据,而是将out指针重新指向了一个新的response结构体。 out最初指向客户端传入的response对象,重新赋值后,客户端接收到的response对象保持不变,导致数据丢失。 而逐字段赋值out.Id = “111”; out.Name = “张三”;直接修改了out指针指向的内存数据,因此客户端可以正确接收。 这体现了Go语言中指针和值传递的区别。
解决方案:必须修改out指针指向的结构体内容,而不是改变out指针本身。 正确的做法是使用逐字段赋值或使用proto.Merge方法来更新out指向的结构体。
通过理解Go语言指针的特性,避免直接用结构体赋值替换out指针,就能有效解决Go-micro v2客户端接收不到服务端响应数据的问题。
以上就是Go-micro v2服务端响应接收失败:形参赋值导致客户端无法获取数据?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2306801.html