[每周一更]-(第100期):介绍 goctl自动生成代码

在自己组件库中,由于部分设计会存在重复引用各个模板的文件,并且基础架构中需要基础模块内容,就想到自动生成代码模板,刚好之前有使用过goctl,以下就简单描述下gozero中goctl场景和逻辑,后续自己借鉴将自己的自动生产逻辑完成再分享。
gozero 是一个支持微服务的 Golang Web 和 RPC 框架,它提供了一套工具用于快速生成代码。其中,goctl 是 GoZero 的一个重要工具,用于根据 API 定义文件自动生成代码。理解 goctl 自动生成代码模块的逻辑,有助于开发者快速上手并有效使用 GoZero 框架。
gozero 和 goctl 介绍
- gozero:是一个基于 Go 语言的微服务框架,提供了 Web 和 RPC 支持,旨在提高开发效率并简化微服务架构的开发和维护。
- goctl:是 GoZero 提供的一个命令行工具,用于根据定义文件自动生成代码,包括 API 接口、数据模型、服务逻辑等,goctl 也可以是 go-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。
goctl 自动生成代码的逻辑
goctl 的工作流程大致分为以下几个步骤:
- 定义 API 文件:开发者编写一个
.api文件,描述 API 的接口、请求和响应参数。 - 解析 API 文件:goctl 读取并解析
.api文件,将其转换为内部的数据结构。 - 生成代码模板:根据解析后的数据结构,goctl 应用代码模板生成各类代码文件。
- 生成文件:将生成的代码模板输出到指定的目录中,供开发者使用和扩展。
详细步骤
1. 定义 API 文件
API 文件使用特定的语法描述服务接口。例如:
syntax = "v1"info(title: "User Service"description: "Service for user management"
)type (UserRequest {Name string `json:"name"`Age int `json:"age"`}UserResponse {Id int `json:"id"`Name string `json:"name"`}
)service user-api {@handler CreateUserpost /users (UserRequest) returns (UserResponse)
}
2. 解析 API 文件
goctl 读取 .api 文件并解析其内容,转换为内部的数据结构。解析器会识别文件中的语法,并将接口、请求和响应参数等信息提取出来。
3. 生成代码模板
解析后的数据结构会传递给代码生成器,代码生成器会使用预定义的模板生成代码。GoZero 使用 template 包或其他模板引擎来生成代码文件。例如,生成处理器代码、数据模型、路由配置等。
4. 生成文件
最终,生成的代码模板会输出到指定的目录中。例如,生成的代码文件可能包括:
- handler 文件:包含处理请求的逻辑。
- model 文件:包含数据模型定义。
- router 文件:配置路由信息。
示例:使用 goctl 生成代码
假设我们有一个 user.api 文件,内容如下:
syntax = "v1"info(title: "User Service"description: "Service for user management"
)type (UserRequest {Name string `json:"name"`Age int `json:"age"`}UserResponse {Id int `json:"id"`Name string `json:"name"`}
)service user-api {@handler CreateUserpost /users (UserRequest) returns (UserResponse)
}
使用 goctl 命令生成代码:
goctl api go -api user.api -dir .
命令说明:
goctl api go:指定生成 Go 语言代码。-api user.api:指定 API 文件。-dir .:指定生成代码的输出目录。
生成的目录结构可能如下:
.
├── etc
│ └── user-api.yaml
├── user
│ ├── user.go
│ ├── userhandler.go
│ ├── userlogic.go
│ ├── usermodel.go
│ └── userservice.go
└── user-api.go
生成代码文件解释
- user.go:主服务入口文件。
- userhandler.go:包含 CreateUser 处理器的代码。
- userlogic.go:包含业务逻辑处理的代码。
- usermodel.go:包含数据模型的定义。
- userservice.go:包含服务层的代码。
- user-api.go:API 服务的初始化代码。
示例生成 API 服务
以下是一个简单的示例,演示如何使用 goctl 生成一个 API 服务:
API 描述文件(example.api)
info:title: Example APIversion: 1.0.0desc: This is an example APItypes:UserRequest {Name string `json:"name"`Age int `json:"age"`}UserResponse {ID int `json:"id"`Name string `json:"name"`Age int `json:"age"`}service:- getUserget /user/{id}returns (UserResponse)- createUserpost /userrequest (UserRequest)returns (UserResponse)
使用 goctl 生成代码
运行以下命令,使用 goctl 根据 API 描述文件生成代码:
bash
复制代码
goctl api go -api example.api -dir .
生成的目录结构
plaintext
复制代码
.
├── etc
│ └── example-api.yaml
├── internal
│ ├── config
│ │ └── config.go
│ ├── handler
│ │ ├── createuserhandler.go
│ │ └── getuserhandler.go
│ ├── logic
│ │ ├── createuserlogic.go
│ │ └── getuserlogic.go
│ ├── svc
│ │ └── servicecontext.go
│ └── types
│ └── types.go
├── example.api
└── example.go
代码逻辑
- API 描述文件解析:
goctl读取example.api文件,解析出getUser和createUser两个接口,以及UserRequest和UserResponse数据类型。
- 生成配置文件:
etc/example-api.yaml:用于存放服务配置,例如服务端口、数据库连接等信息。
- 生成代码文件:
internal/config/config.go:用于加载和管理配置文件。internal/handler:存放 HTTP 请求处理逻辑,每个接口对应一个处理函数。internal/logic:存放具体的业务逻辑,每个接口对应一个逻辑处理函数。internal/svc/servicecontext.go:用于初始化服务的上下文,管理服务依赖。internal/types/types.go:定义请求和响应的数据类型。
优势
- 自动化:通过描述文件自动生成代码,大大减少了手工编码的工作量。
- 规范化:生成的代码符合
go-zero框架的最佳实践,确保代码风格一致,结构清晰。 - 高效:快速生成 API 服务,提高开发效率。
参考
- api-demo
- 微服务效率工具 goctl 深度解析(上)
- goctl-api
相关文章:
[每周一更]-(第100期):介绍 goctl自动生成代码
在自己组件库中,由于部分设计会存在重复引用各个模板的文件,并且基础架构中需要基础模块内容,就想到自动生成代码模板,刚好之前有使用过goctl,以下就简单描述下gozero中goctl场景和逻辑,后续自己借鉴将自…...
碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测
碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 : 碳素钢按化学成分(即以含碳量)可分为低碳钢、中…...
C++ list链表的使用和简单模拟实现
目录 前言 1. list的简介 2.list讲解和模拟实现 2.1 默认构造函数和push_back函数 2.2 迭代器实现 2.2.1 非const正向迭代器 2.2.2 const正向迭代器 2.2.3 反向迭代器 2.3 插入删除函数 2.3.1 insert和erase 2.3.2 push_back pop_back push_front pop_front 2.4 构…...
dependencies?devDependencies?peerDependencies
之前使用的npm包中,我用到了sass包。我当时没有在packagejson中添加依赖项,而是另外install的。这就引起了我的一个思考 初步想法: 我的npm包需要使用sass,那么我应该放在dependencies中,当使用的时候会直接下载 问题…...
在LUAT中使用MQTT客户端,游戏脚本,办公脚本自动操作
本文将介绍在LUAT中工程化使用MQTT客户端的方法及注意事项。实验平台为合宙AIR724UG,其固件版本为Luat_V4001_RDA8910_FLOAT_TMP。 面向对象 使用middleclass库为脚本提供基础面向对象支持,将此repo中的middleclass.lua文件添加到项目中即可使用。middl…...
如何解决maven中snapshot相关jar无法拉取问题
Maven中的SNAPSHOT版本是指正在开发中的版本,这些版本可能会频繁地更新。在使用Maven构建项目时,有时会遇到无法拉取SNAPSHOT相关jar的问题。以下是几种常见的解决方案: 1. 检查Maven配置文件(settings.xml) 确保你的M…...
类似crossover的容器软件有哪些 除了crossover还有什么 Mac虚拟机替代品
CrossOver是Mac用来运行exe文件的一款软件,但是并不是所有的exe文件CrossOver都支持运行。想要在Mac上运行exe文件的方法并不是只有使用CrossOver这一种,那么有没有类似的软件也可以实现exe文件在Mac上运行呢? CrossOver类似软件有哪些 1、Pl…...
以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】
【Less-54】 与前面的题目不同是,这里只能提交10次,一旦提交超过十次,数据会重新刷新,所有的步骤需要重来一次。 解题步骤: 根据测试,使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …...
详解 Flink 的时间语义和 watermark
一、Flink 时间语义类型 Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事件时间戳Ingestion Time :是数据进入 Flink…...
Unreal Engine项目结构与关卡设置详解
引言 Unreal Engine 是一款功能强大的游戏引擎,为开发者提供了丰富的工具来创建和管理游戏项目。本文将详细介绍一个基本的 Unreal Engine 项目结构,并讲解如何在 Unreal 编辑器中进行关卡设置与操作。 Unreal Engine 项目结构 一个基本的 Unreal Eng…...
Access数据中的SQL偏移注入
使用场景: 目标数据表的字段较多,无法一一获取的时候,尝试使用偏移注入的方式实现SQL注入。 原理: 例如:一个表有6个字段,而你想获取的目标表admin的字段不知道,此时可以使用联合查询的方式获…...
Unity 编辑器扩展,获取目录下所有的预制件
先看演示效果 实现方案 1创建几个用于测试的cube 2,创建一个Editor脚本 3,编写脚本内容 附上源码 using UnityEditor; using UnityEngine;public class GetPrefeb : EditorWindow {private string folderPath "Assets/Resources"; // 指定预…...
【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)
文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中,ValueError 是一个常见的异常类…...
政安晨【零基础玩转各类开源AI项目】解析开源:gradio:改进真实虚拟试穿的扩散模型
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! Gradio 是一个开源 Python 软件包,可以让你…...
深入解读Prometheus Adapter:云原生监控的核心组件
一、引言 Prometheus Adapter的背景与重要性 在现代的云原生架构中,微服务和容器化技术得到了广泛的应用。这些技术带来了系统灵活性和扩展性的提升,但同时也增加了系统监控和管理的复杂度。Prometheus作为一款开源的监控系统,因其强大的指标…...
【计算机视觉】数字图像处理基础:以像素为单位的图像基本运算(点运算、代数运算、逻辑运算、几何运算、插值)
0、前言 在上篇文章中,我们对什么是数字图像、以及数字图像的组成(离散的像素点)进行了讲解🔗【计算机视觉】数字图像处理基础知识:模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类。 我们知道&a…...
Spring Boot整合WebSocket和Redis实现直播间在线人数统计功能
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...
uniapp自定义的下面导航
uniapp自定义的下面导航 看看效果图片吧 文章目录 uniapp自定义的下面导航 看看效果图片吧  前言一、写组件、我这里就没有写组件了直接写了一个页面?总结 前言 在…...
【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法
StaleElementReferenceException 是 Selenium WebDriver 中的一种异常,通常在元素与当前页面的状态不同步时抛出,比如页面已经刷新或导航到另一个页面,但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…...
Apache IoTDB 分布式架构三部曲(三)副本与共识算法
IoTDB 首创并应用的共识协议统一框架,为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言,为了使得海量数据场景下集群能够横向扩展,集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上,从而能够更…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
