go-zero(二) api语法和goctl应用
go-zero api语法和goctl应用
在实际开发中,我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板,包括模型、逻辑、处理器、路由等,大幅提高开发效率。
一、构建api demo
现在我们通过 goctl 创建一个最小化的 HTTP 服务来了解 goctl 的 go-zero api 服务的概况,
创建一个项目目录,然后再这个目录下执行命令:
goctl api new user
goctl api 是 goctl 中的核心模块之一,可以通过 api 文件一键快速生成一个 go-zero项目。new参数不需要 API 文件便能生成 Go HTTP 服务,user 是服务名称,可以自定义。
1. 项目结构说明
命令执行成功后,会在当前目录下生成一个 user目录,目录包含一些文件:
├── user.api
├── user.go
├── etc
│ └── user-api.yaml
├── go.mod
└── internal├── config│ └── config.go├── handler│ ├── demohandler.go│ └── routes.go├── logic│ └── demologic.go├── svc│ └── servicecontext.go└── types└── types.go
goctl 生成的是一个典型的 go-zero 项目结构,每个文件和目录都有其特定的功能。下面介绍下每个文件的功能。
xxx.api
这个文件是 go-zero 的 API 定义文件,用于描述服务的接口、请求和响应结构。在这个文件中,可以定义:
- 请求体的结构(如需要的字段)。
- 响应体的结构(返回给客户端的数据)。
- 服务的路由和处理器(可以使用 HTTP 方法和路径)。
xxx.go(一般是用api的文件名,例如user.go)
这个文件的主要作用是将 API 的定义和实际的业务代码连接起来,main函数的入口。
user-api.yaml
里面储存了一些运行服务时需要的配置信息,包括:
- 服务名、地址、端口
- 数据库连接字符串
- redis 、etcd服务配置
- 开发模式、日志输出等级等等
config.go
负责读取 user-api.yaml 配置文件并将其解析为 Go 语言中的结构体。
routes.go
负责定义 HTTP 路由,将请求的 URL 路径与处理请求的具体函数(handler)绑定。
- 初始化路由:设置 HTTP 方法和路径,并将其与具体的处理函数关联。
- 中间件应用:在路由定义中,可以将中间件与特定的路由关联。
xxxhandler.go
主要用来处理返回信息
- 请求处理函数:具体实现 API 请求的逻辑,如接收请求、调用业务逻辑层、构建响应等。
- 错误处理:处理业务逻辑中的错误并返回合适的响应。
logic/xxxlogic.go
该文件封装了相关的业务逻辑。
- 主要业务逻辑:实现具体的用户操作,如添加用户、获取用户信息等。
- 与数据层交互:调用数据层的方法以访问数据库。
servicecontext.go
用来调用config.go中配置信息,并把他们注册倒服务中,相当于服务的基本环境,例如数据库连接、缓存客户端等。可以在不同的请求处理之间传递,以便在整个应用中保持一致性。
- 字段定义:定义应用所需的实例,例如 DB、Cache、Logger、配置等。
- 构造函数:初始化服务上下文的构造函数,将所需资源注入上下文。
types/types.go
通常用于定义与业务逻辑或数据层交互的数据结构。
- 数据结构:定义与用户、订单、商品等业务相关的结构体。
- 序列化:可以包含用于 JSON 序列化和反序列化的结构体。
2. api语法介绍和分析
我们在实现业务逻辑之前,先来看下user.api文件,因为我们都项目代码是基于user.api自动生成的。
我这边不会系统的介绍api语法,用到什么我讲什么,如果需要具体了解更多的api语法可以看官方文档:
https://go-zero.dev/docs/tasks/dsl/api
syntax = "v1" //指定了使用的语法版本为 "v1"。这个是固定写法//Request 请求类型 ,包含一个字段 Name
type Request {//options=you|me:表示该字段只能接受 "you" 或 "me" 这两个值,以确保输入的有效性Name string `path:"name,options=you|me"`}
//定义了名为 Response 的响应类型,包含一个字段 Message,该字段将在返回的 JSON 响应中被使用。
type Response {Message string `json:"message"`
}service user-api {//指明处理该 API 请求的处理函数是 UserHandler@handler UserHandler//定义一个 GET 请求路由,当访问路径为 /from/:name//(Request) returns (Response)代表这个api需要请求参数,并且返回一个响应参数get /from/:name (Request) returns (Response)
}
3. 实现api demo
这个api demo功能很简单,就是当用户当用户访问 /from/:name 这个路径时,返回一个自定义消息,这里我们就值返回传入的name。
下面我们打开internal/logic/userlogic.go文件, 找到NewUserLogic方法,把代码修改为:
// todo: add your logic here and delete this line// return //注释掉原来的return return &types.Response{Message: req.Name, //返回从requset接受过来的name}, nil
使用postman或者 curl ,执行 127.0.0.1:8888/from/you 或者127.0.0.1:8888/from/me,运行效果如下:

注意:如果运行时出现 error: config file user/etc/user-api.yaml ,找不到配置文件,在user.go中,把配置文件路径重新设置下。
4. 修改api
之前的项目,name只能传入you或者me ,如果我们想要实现传入任意字符,怎么实现?
type Request struct {//Name string `path:"name,options=you|me"` Name string `path:"name"` //删除options选项
}type Response struct {Message string `json:"message"`
}
只需要在types.go文件中把,options=you|me 这段删除即可。但考虑到这个文件是goctl自动生成的,如果修改了,使用goctl重新生成代码时会自动覆盖。
我们可以在 user.api 文件中,删除 options=you|me 的部分。然后,您可以根据 user.api 文件使用goctl重新生成新的代码:
goctl api go --api user.api --dir ./
goctl api go 是根据 api 文件生成 Go HTTP 代码。
--api后面是 api文件--dir后面是代码生成的目录
执行之后,go-zero的设计思想就是专心的业务逻辑实现,可以看到goctl 自动帮我们忽略了下面这些已经存在的文件,也就说其他文件都自动覆盖了。
etc/user-api.yaml exists, ignored generation
internal/config/config.go exists, ignored generation
user.go exists, ignored generation
internal/svc/servicecontext.go exists, ignored generation
internal/handler/userhandler.go exists, ignored generation
internal/logic/userlogic.go exists, ignored generation
Done.
我们可以再去看下types.go文件,name字段已经没有选项了。
5. 启动服务
这时候我们就可以输入任意字符串了

相关文章:
go-zero(二) api语法和goctl应用
go-zero api语法和goctl应用 在实际开发中,我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板,包括模型、逻辑、处理器、路由等,大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…...
java 操作Mongodb
CRUD基础操作 Springboot 操作 MongoDB 有两种方式。 第一种方式是采用 Springboot 官方推荐的 JPA 方式,这种操作方式,使用简单但是灵活性比较差。第二种方式是采用 Spring Data MongoDB 封装的 MongoDB 官方 Java 驱动 MongoTemplate 对 MongoDB 进行…...
以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。
江河湖海中的代码之旅:打造你的命令行图书管理系统 一、系统简介 1. Java简介 Java,这个编程语言界的“瑞士军刀”,自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下,Java就像是一条蜿蜒曲折…...
[JavaWeb]微头条项目
完整笔记和项目代码: https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发 1 项目简介 1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜…...
Linux(CentOS)安装达梦数据库 dm8
CentOS版本:CentOS 7,查看操作系统版本信息,请查阅 查看Linux内核版本信息 达梦数据库版本:dm8 一、获取 dm8 安装文件 1、下载安装文件 打开达梦官网:https://www.dameng.com/ 下载的文件 解压后的文件 2、上传安…...
【专题】中国企业出海洞察报告暨解码全球制胜之道报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38314 在当今全球化的浪潮中,中国企业的出海行动正以前所未有的规模和速度展开,成为全球经济舞台上的重要力量。本报告旨在对 2024 年中国企业出海情况进行深度洞察,涵盖多个领域和视角。 从对外投…...
[ 跨域问题 ] 前后端以及服务端 解决跨域的各种方法
这篇文章主要介绍了跨域问题,包括其定义、产生原因及各种解决方法。原因是浏览器安全策略限制,方法有 JSONP、CORS、Domain、 postMessage、Nginx配置、.NetCore配置。 前言 什么是跨域问题? 在Web应用中,当一个网页的脚本试图去请求另一个域…...
网络安全之信息收集-实战-2
请注意,本文仅供合法和授权的渗透测试使用,任何未经授权的活动都是违法的。 目录 7、网络空间引擎搜索 8、github源码泄露 9、端口信息 10、框架指纹识别 11、WAF识别 12、后台查找 7、网络空间引擎搜索 FOFA:https://fofa.info/ 360 …...
利用飞书多维表格自动发布版本
文章目录 背景尝试1,轮询尝试2,长连接 背景 博主所在的部门比较奇特,每个车型每周都需要发版,所以实际上一周会发布好几个版本。经过之前使用流水线自动发版改造之后,发版的成本已经大大降低了,具体参考&a…...
深入内核讲明白Android Binder【一】
深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…...
Photoshop(PS)——人像磨皮
1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…...
如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐
在日常办公中,我们有时需要将文件夹中的所有文件名整理在Excel表格中,方便管理和查阅。手动复制文件名既费时又易出错,因此本文将介绍两种利用Excel自动提取文件夹中所有文件名的方法,帮助你快速整理文件信息。 方法一࿱…...
YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点
摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...
【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别
👉🏼目录👈🏼 🍒1. 数据 1.1 准备数据 1.2 数据预处理 🍒2. 模型构建 2.1 模型测试 2.2 测试网络运算速度 2.3 输出模型参数量 2.4 输出模型计算量 🍒3. 模型训练 🍒4.模…...
chatgpt训练需要什么样的gpu硬件
训练像ChatGPT这样的大型语言模型对GPU硬件提出了极高的要求,因为这类模型的训练过程涉及大量的计算和数据处理。以下是训练ChatGPT所需的GPU硬件的关键要素: ### 1. **高性能计算能力** - **Tensor Cores**: 现代深度学习训练依赖于Tensor Cores&#…...
Kubernetes常用命令
Kubernetes常用命令 一、集群管理 kubectl cluster-info:显示集群信息,包括控制平面地址和服务的 URL。 kubectl get nodes:查看集群中的节点列表,包括节点状态、IP 地址等信息。 kubectl describe node <node-name>&…...
Flutter:key的作用原理(LocalKey ,GlobalKey)
第一段代码实现的内容:创建了3个块,随机3个颜色,每次点击按钮时,把第一个块删除 import dart:math; import package:flutter/material.dart; import package:flutter_one/demo.dart;void main() {runApp(const App()); }class App…...
R语言基础入门详解
文章目录 R语言基础入门详解一、引言二、R语言环境搭建1、安装R和RStudio1.1、步骤1.2、获取工作目录 三、R语言基础2、语法基础2.1、赋值操作2.2、注释 3、数据类型与结构3.1、向量3.2、矩阵 4、基本操作4.1、数据读取4.2、数据可视化 四、R语言使用示例4.1、统计分析示例4.2、…...
django启动项目报错解决办法
在启动此项目报错: 类似于: django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动,以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…...
详细描述一下Elasticsearch搜索的过程?
大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch搜索的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch搜索的过程? Elasticsearch 的搜索过程是其核心功能之一,允许用户对存储在 Elasticsea…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
