当前位置: 首页 > news >正文

[每周一更]-(第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 的工作流程大致分为以下几个步骤:

  1. 定义 API 文件:开发者编写一个 .api 文件,描述 API 的接口、请求和响应参数。
  2. 解析 API 文件:goctl 读取并解析 .api 文件,将其转换为内部的数据结构。
  3. 生成代码模板:根据解析后的数据结构,goctl 应用代码模板生成各类代码文件。
  4. 生成文件:将生成的代码模板输出到指定的目录中,供开发者使用和扩展。

详细步骤

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
代码逻辑
  1. API 描述文件解析
    • goctl 读取 example.api 文件,解析出 getUsercreateUser 两个接口,以及 UserRequestUserResponse 数据类型。
  2. 生成配置文件
    • etc/example-api.yaml:用于存放服务配置,例如服务端口、数据库连接等信息。
  3. 生成代码文件
    • 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自定义的下面导航 看看效果图片吧 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6aa0e964741d4dd3a58f4e86c4bf3247.png) 前言一、写组件、我这里就没有写组件了直接写了一个页面?总结 前言 在…...

【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常,通常在元素与当前页面的状态不同步时抛出,比如页面已经刷新或导航到另一个页面,但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…...

Apache IoTDB 分布式架构三部曲(三)副本与共识算法

IoTDB 首创并应用的共识协议统一框架,为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言,为了使得海量数据场景下集群能够横向扩展,集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上,从而能够更…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

JS红宝书笔记 - 3.3 变量

要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...

scan_mode设计原则

scan_mode设计原则 在进行mtp controller设计时,基本功能设计完成后,需要设计scan_mode设计。 1、在进行scan_mode设计时,需要保证mtp处于standby模式,不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可&#xf…...

【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解

Nginx 是什么:高性能的HTTP和反向代理Web服务器。怎么用:通过配置文件定义代理规则、负载均衡、静态资源服务等。为什么用:提升Web服务性能、高并发处理、负载均衡和反向代理。优缺点:轻量高效,但动态处理能力较弱&am…...