【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范
【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范
大家好 我是寸铁👊
总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨
喜欢的小伙伴可以点点关注 💝
问题背景
大家好,我是寸铁!今天在今天在编写gozero的api和rpc时,出现了个小bug,下面我们一起来看一下这个bug是什么?
今天在编写gozero的api和rpc进行测试的时候,想要通过id去调数据库的数据。
测试结果如下:
很明显,并没有成功拿到数据库的数据。

数据库是有对应数据的。

排查问题
可以从
rpc、api层的代码中打印到数据库的数据,说明编写逻辑是没问题的。
rpc层打印信息如下:

api层打印信息如下:

编写
api、rpc层的逻辑赋值常用copier.Copy(resp , res)函数。
但是在这一处copier.Copy(resp , res)时候发现resp打印内容是db设置的默认值,这就说明调用这个函数时,无法成功赋值!
那为什么赋值不成功呢?
我们先来看一下函数的底层结构是怎么样的?
进入函数的表层,发现主要是传入两个参数。
一个是要
目标数据(你想赋值的位置),一个是数据来源(你要赋值的数据),这两个都是接口类型,说明可以传入任意类型的参数。

再进入copier函数的底层封装实现看看:
本质是基于反射实现的,对数据的各种类型和数值进行处理。
由于篇幅过长,感兴趣的同学可以去阅读源码


好,到了这里我们需要思考一个问题,很明显是调用Copy函数赋值不成功,那么这里就需要对传入的参数进行思考。
- 到底是参数传反了?
- 还是说传入的参数不对?
- 还是说传入的参数结构有要求?
回头看看这个函数,逐个对猜想进行排查。

排查如下:
-
第一种,位置不对,这里的
res是从数据库查到的数据,再把他赋值给resp响应,这是没问题的 -
第二种,
res是我从数据库查到的数据,resp是赋值的响应信息,这两部分都是结构体,并且语法也通过了,这也是没问题的。 -
第三种,传入的参数的
结构对不上,或者说错乱。
在排查了前两种可能性后,只有第三种的概率比较大。
再使用一下参数,发现还能够通过
res点出Goods,这说明之前编写的rpc层的proto文件和api层的api文件的编写结构不一致或者说嵌 套了导致调用的混乱。

那就需要重新回到一开始的rpc层的proto文件和api层的api文件编写上了!
解决问题
这里是根据
id查询数据库的信息,不需要再套多一层。
主要是最开始的proto、api文件的编写问题,不要再套多一层,直接就是返回需要返回的信息即可。
proto文件如下编写为正确规范:

api文件编写正确规范如下:

如下编写错误,这里不要再套多一层!!!

修改完文件后,重新用goctl重新生成api、rpc层代码
resp的内容如下:

res的内容如下:

重新测试
重启服务后,测试结果如下:

这样就成功拿到信息啦!
总结回顾
-
如果只是返回根据
id查询单个的信息,不要套一层结构体,直接把商品的信息返回出去,不要再套一层,否则在后面的copier函数很混乱,导致结构体赋值失败。 -
如果要返回查询的信息的
列表时,可以选择嵌套多一层。
注意:编写文件的规范取决于你的
需求和生产环境,使用时可以适当参考本文编写规范。
往期好文💕
保姆级教程
【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero
【Go-Zero】手把手带你在goland中创建api文件并设置高亮
报错解决
【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项
【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案
【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案
【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案
【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案
【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案
【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案
Go面试向
【Go面试向】defer与time.sleep初探
【Go面试向】defer与return的执行顺序初探
【Go面试向】Go程序的执行顺序
【Go面试向】rune和byte类型的认识与使用
【Go面试向】实现map稳定的有序遍历的方式
相关文章:
【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范
【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁👊 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 💝 问题背景 大家好,我是寸铁!…...
SpringBootWeb快速入门
1.创建springboot工程,新建module 2.勾选web开发相关依赖 3.删除多余文件 4.新建类 5.启动类中运行main方法 6.启动 默认端口号8080 7.打开浏览器,地址栏输入 8.报错 9.原因,控制层位置放错,剪切controller层放进com.example …...
【书生·浦语大模型实战营】第 2 节 -课后作业
第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗? 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接:https://github.com/internLM/tutorial 首先,这个课程是免费…...
Java如何使用OpenCV
背景:利用OpenCV功能批量处理视频 OpenCV(Open Source Computer Vision Library)是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的功能和工具,可用于处理图像和视频数据,并在各种应用中发挥着重要作…...
C++指针(三)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…...
消息中间件之RocketMQ源码分析(二十七)
Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后,不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker,Broker端处理该请求的类是EndTransactionProcessor 第一步&…...
C习题002:澡堂洗澡
问题 输入样例 在这里给出一组输入。例如: 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如: No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…...
智能双星:遥测终端机与柳林“巡检机器人“,助力智能运维新升级!
随着科技的不断发展,智能化、自动化的运维管理已经成为企业追求高效、稳定运营的重要方向。柳林遥测终端机、柳林e拍云平台以及巡检机器人的组合,为企业带来了一种全新的、前置的、无感的智能运维体验。 柳林遥测终端机,以其强大的数据采集和…...
算法复习之前缀和【备战蓝桥杯】
一维前缀和 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二维前缀和 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为: S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] S[x1 - 1, y1 - …...
IDEA基础——Maven配置tomcat
配置方案 一、配置maven-tomcat plugin插件(只最高支持到tomcat 8)~~1.添加镜像源,获取tomcat 8插件配置~~~~1.1 在pom.xml里先添加镜像源~~~~1.2 添加tomcat插件配置~~ 2. 添加tomact官方发布的插件配置(无需添加镜像源ÿ…...
数据结构测试题
目录 1.闰年判断 2.志愿者选拔 3.单词接龙 4.对称二叉树 5.英雄南昌欢迎您 6.时间转换 7.矩阵乘法 8. Huffuman树 1.闰年判断 题目描述: 给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年: 1. 年…...
【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)
1、动力学模型 Rectangular Joint 控制平面上(x,y轴)的移动,去掉以后,机器人在原地翻滚不移动 Rigid Transform 坐标转换,B站视频已收藏 去掉,机体与地面贴合 此处的作用是设定机体的初…...
Launch学习
参考博客: (1) 史上最全的launch的解析来啦,木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包,假设需要使用机器人导航模块,但是这个模块中包含着地图、定位、路径规划等不同的功能包,它们的逻…...
蓝桥OJ 2942数字王国之军训排队 DFS剪枝
蓝桥OJ 2942数字王国之军训排队 #include<bits/stdc.h> using namespace std;const int N 15;//最多10队 int a[N], n; vector<int>v[N];//二维数组 v[i]记录队伍i中所有人的编号bool dfs(int cnt, int dep) {if (dep n1){//判断合法性for (int i 1; i < n; …...
SSL证书
SSL证书(Secure Sockets Layer证书)是一种网络安全协议,用于在互联网上建立加密链接,确保数据在从用户浏览器到服务器之间传输的过程中保持私密性和完整性。尽管现在实际上已经被TLS(Transport Layer Security…...
【C++】string 类 ( 上)
标准库中的string类 注意: 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。 比特就业课 3. string在底层实际是:basic_string模板类的别名,typedef basi…...
《中华人民共和国消防法》(2021年修订版)解读
单选题(共7题,每题5分) 1、举办大型群众性活动,承办人应当依法向()申请安全许可。 正确答案:B、公安机关 2、违反消防安全规定进入生产、储存易燃易爆危险品场所的,情节严重的要处…...
vue+element模仿实现云码自动验证码识别平台官网
一、项目介绍 项目使用传统vue项目结构实现,前端采用element实现。 element官网:Element - The worlds most popular Vue UI framework 云码官网地址:云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图,支持…...
蓝桥杯练习系统(算法训练)ALGO-992 士兵杀敌(二)
资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。 小工是南将军手下的军师&…...
Pycharm下如何生成exe软件
第一步 下载pyinstaller pip install pyinstaller 对pyinstaller第二步 使用pyinstaller cmd切换到项目目录执行命令:pyinstaller --add-data “./templates;templates” 入口文件名.py...
如何快速安全弹出USB设备:终极USB磁盘弹出工具使用指南
如何快速安全弹出USB设备:终极USB磁盘弹出工具使用指南 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quick, flexible, portable altern…...
Claude Code安装和接入deepseek笔记
序言 Claude Code安装不需要注册Claude账号,因为https://claude.com/ 不对国内大陆地区提供服务,正常访问无法注册账号。不注册Claude账号只是无法使用 Claude Code提供的大模型,正好我也想接入deepseek来使用,因此在接入自己的大…...
从Vivado工程到上电自启:ZYNQ7020双核ARM+FPGA的完整启动流程详解
ZYNQ7020双核ARMFPGA启动全流程深度解析:从比特流到系统自举 当你按下ZYNQ开发板的电源键时,一个精密的启动交响乐便开始演奏——FPGA配置数据从Flash中苏醒,ARM核执行第一条指令,各外设模块按序初始化。这个看似自动化的过程背后…...
2026中大型组织人事管理痛点剖析及数字化解决方案,有没有值得推荐的人事管理软件?
在数字化转型深化的当下,中大型组织(集团企业、多业态公司等)因组织架构复杂、人员规模庞大、业务场景多元,人事管理面临诸多瓶颈,严重制约组织效能提升与人才战略落地。本文聚焦中大型组织人事管理核心痛点࿰…...
基于STM32LXXX的数字电位器(TPL1401DSGR)驱动应用程序设计
一、简介: TPL1401DSGR 是 TI 带输出缓冲器的数字电位器,相比普通数字电位器,其缓冲输出能保证负载改变时电压不跌落,非常适合作为可编程电压源使用。 二、主要技术特性: 抽头数:256(8bit 分辨率) 接口:I2C(支持 1MHz Fast+ 模式) 工作电压:1.8V ~ 5.5V(与 STM…...
快速构建精简Windows 11系统:tiny11builder完整使用指南
快速构建精简Windows 11系统:tiny11builder完整使用指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了臃肿的Windows 11系统࿱…...
基于Simulink的2ASK调制解调系统建模与性能对比分析
1. 2ASK调制解调系统基础入门 第一次接触通信系统仿真时,我被各种调制方式搞得头晕眼花。直到用Simulink搭建了第一个2ASK模型,才发现原来通信原理可以这么直观。**2ASK(二进制幅移键控)**是最基础的数字调制方式之一,…...
制造业设计团队文档管理选型实战
制造业设计团队文档管理选型实战 某中型机械制造企业,研发团队47人,日常需要管理CAD图纸、BOM表、工艺文件、技术规范等超过120万份文件。过去三年,这支团队换了两次文档管理系统,第二套系统上线8个月后被迫重建——原因是设计部门…...
Java企业级应用开发:Phi-4-mini-reasoning辅助SpringBoot微服务构建
Java企业级应用开发:Phi-4-mini-reasoning辅助SpringBoot微服务构建 1. 当AI推理遇上企业级Java开发 想象一下这样的场景:你的电商平台突然遭遇订单激增,原有的业务逻辑开始出现各种边界情况。传统的硬编码规则已经难以应对,而手…...
Serilog:从结构化日志认知到 .NET 工程落地橇
1. 前言 本文详细介绍如何使用 kylin v10 iso 文件构建出 docker image,docker 版本为 20.10.7。 2. 构建 yum 离线源 2.1. 挂载 ISO 文件 mount Kylin-Server-V10-GFB-Release-030-ARM64.iso /media 2.2. 添加离线 repo 文件 在/etc/yum.repos.d/下创建kylin-local…...
