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

news2024/11/25 2:21:44

在这里插入图片描述

​ 在自己组件库中,由于部分设计会存在重复引用各个模板的文件,并且基础架构中需要基础模块内容,就想到自动生成代码模板,刚好之前有使用过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 CreateUser
    post /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 CreateUser
    post /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 API
  version: 1.0.0
  desc: This is an example API

types:
  UserRequest {
    Name string `json:"name"`
    Age  int    `json:"age"`
  }

  UserResponse {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
  }

service:
  - getUser
    get /user/{id}
    returns (UserResponse)

  - createUser
    post /user
    request (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1803849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

文章目录 map组件基础使用封装map.js,实现定位1、使用第三方地图:高德,申请对应平台key1、申请H5 key2、申请微信小程序 key3、申请android key查看证书详情,可以看到SHA1查看/设置Android包名 4、申请ios key 2、封装map1、lib/m…

【阿里YYDS】通义千问正式开源 Qwen2

Qwen2–72B正式开源,性能全面超越开源模型Llama3-70B,也超过文心4.0、豆包pro、混元pro等众多中国闭源大模型。 在过去一段时间里,Qwen系列模型从Qwen1.5升级到Qwen2,Qwen2分5个尺寸,包括Qwen2-0.5B、Qwen2-1.5B、Qwen…

启动信息全掌握,Android 15 重磅 API:ApplicationStartInfo

前言 App 进程启动的时候,开发者很难获悉到本次启动的详细信息,比如: 是冷启动的、暖启动的、还是热启动的?是被 Broadcast 拉起来的、Activity 拉起来的、还是 ContentProvider 拉起来的? 针对这些 pain-points&am…

ssm物流管理系统-计算机毕业设计源码44323

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…

解决:DevToolsActivePort file doesn‘t exist的问题

DevToolsActivePort file doesn’t exist 报错信息:解决办法:直接把sandbox禁用了。 chromeOptions.addArguments("--headless"); //设置为 headless 模式 chromeOptions.addArguments("--disable-gpu");//谷歌文档提到需要加上这…

代码随想录算法训练营第二十二天

题目&#xff1a;216. 组合总和 III 这道题和上道题非常类似&#xff0c;大体框架一样只不过修改一下终止条件而已 值得注意的是其中的剪枝条件的设置 一是靠现有的元素和已经大于目标和的话就提前终止&#xff0c;另一个是其中循环那个剪枝可以记住 i < n - (k - path.s…

二开版微交易系统

下载地址&#xff1a;二开版微交易系统

Dockerfille解析

用于构建Docker镜像的文本&#xff0c;由一条条指令构成 Docker执行Dockerfile的流程 1. Docker从基础镜像执行一个容器 2. 执行一条指令并对容器进行修改 3. 执行类型Docker commit的命令添加一个新的镜像层 4. Docker再基于新的镜像执行一个新的容器 5. 执行Dockerfile中…

C语言 | Leetcode C语言题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; int minCut(char* s) {int n strlen(s);bool g[n][n];memset(g, 1, sizeof(g));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) && g[i 1][j - 1];}}int f[n];for (int i 0; i <…

关于修改Python中pip默认安装路径的终极方法

别想了&#xff0c;终极方法就是手动复制&#xff0c;不过我可以给你参考一下手动复制的方法 关于手动移动pip安装包的方法 别想了&#xff0c;终极方法就是手动复制&#xff0c;不过我可以给你参考一下手动复制的方法一、首先确认一下pip默认安装路径二、再确认一下需要移动到…

SAP HCM OPT函数作用

导读 INTRODUCTION OPT函数&#xff1a;SAP HCM工资核算是很多函数的汇总集&#xff0c;原有有兴趣问过SAP的人为什么SCHEMA需要这样设计&#xff0c;SAP的人说是用汇编的逻辑设计的&#xff0c;当时是尽可能用机器语言加速速度读取&#xff0c;每个函数都有对应的业务逻辑代码…

9行超强代码用Python工具快速获取放假日期

9行超强代码用Python工具快速获取放假日期 在很多场景下,我们需要获知国内具体的节假日安排情况,而国内每一年具体的放假安排以及调休情况,都依赖于国务院发布的具体公告,如果不想自己手动整理相关数据的话,我们可以用Python来快速获取最新的放假日期. 可以通过调用公开的 API…

【web前端开发】标签(基础知识详解)

浏览器能识别的标签 编码 <meta charset"UTF-8"> title <title>helloshh</title> 标题 <h1>1级标签</h1> <h2>2级标签</h2> <h3>3级标签</h3> <h4>4级标签</h4> <h5>5级标签</h5> &…

ChatTTS增强版V2,批量导出srt,语速控制,情感控制,支持朗读数字,问题修复

ChatTTS增强版最新版本已经发布&#xff0c;本次更新我主要增加了多文本批量、SRT导出、语速控制、情感控制、停顿控制等新功能&#xff0c;并针对上一版本中存在的数字读音异常、随机uv_break等问题进行了修复。 视频版本 【ChatTTS增强版V2&#xff0c;批量导出srt&#xff…

【计算视觉】学习计算机视觉你不得不膜拜的CVPR大神:何凯明

目录 第一章&#xff1a;CVPR——计算机视觉的终极擂台 第二章&#xff1a;何凯明——计算机视觉领域的耀眼星辰 第三章&#xff1a;高引用论文——计算机视觉研究的璀璨星辰 第四章&#xff1a;何凯明的CVPR论文——深度学习的探索之旅 第五章&#xff1a;结语——向何凯…

网页文档下载不了怎么办 网页文档下载方法

一个方法&#xff0c;搞定所有网页文档下载。如果你也需要从网页下载各种文档&#xff0c;那么本文一定可以帮到你。无须充值会员&#xff0c;各大平台文档下到爽。看到就是赚到&#xff0c;还不赶快学起来。有关网页文档下载不了怎么办&#xff0c;网页文档下载方法的问题&…

Java中的IO流字节流(FileOutputStream与FileInputStream)+编码与解码

目录 ​编辑 IO流 File0utputstream FileOutputstream写数据的3种方式 void write(int b) 一次写一个字节数据 void write(byte[] b) 一次写一个字节数组数据 void write(byte[] b,int off,int len) 一次写一个字节数组的部分数据 FileOutputstream写数据的…

MathType 7.8最新版核心功能特性 及免费汉化版安装包下载地址

大家好&#xff01;今天我要给大家种草一个非常实用的数学公式编辑器——MathType 7.8&#xff01;作为一名软件评测专家&#xff0c;我对这款软件进行了详细的测试和试用&#xff0c;下面来给大家分享一下我的使用体验。 我们来说说MathType 7.8的核心特性吧&#xff01;它是一…

智能网联汽车信息安全风险识别与应对策略研究综述

摘要&#xff1a;随着智能网联汽车技术的飞速发展&#xff0c;其信息安全问题逐渐成为公众关注的焦点。本文概述了智能网联汽车技术的发展背景和信息安全风险的来源&#xff0c;采用STRIDE威胁分析方法对智能网联汽车的四层模型进行风险识别&#xff0c;进一步探讨了抗女巫攻击…