Vscode niuhe 插件使用教程(1) - 插件初体验

插件介绍

Vscode niuhe 插件是一款面向 golang 的后端 IDL 定义翻译插件, 支持 go 程序的路由, 出入参定义;同时支持将 idl 翻译为 typescript 定义

插件使用

下面从一个空项目 adminsvr 开始讲解 niuhe 插件的基本使用。使用前需要先安装 niuhe 插件;插件介绍页有详细教程

程序入口

程序默认将项目下的 niuhe/all.niuhe 文件作为入口,在开始前需要读取项目名及配置参数,然后是对应的配置参数读取。

开始前在项目下创建 niuhe 目录和niuhe/all.niuhe 文件。并在其中定义项目名app。此时将项目名定义为adminsvr插件语法高亮请选择为 python

定义请求参数和 API

接下来演示一个简单的 Hello world 例子, 继续编辑我们的 all.niuhe 文件如下:

python 复制代码
#app=adminsvr

class SysTestReq(Message):
    '''测试请求参数'''
    say = required.StringField(desc='这是一个必填 string 类型请求参数')

class SysTestResp(Message):
    '''测试返回参数'''
    answer = required.StringField(desc='作为返回参数时, 必填字段可忽略, 这里是定义类型的')

with services():
    GET('演示例子', '/api/sys/test/', SysTestReq, SysTestResp)
  

下面对上面的代码进行逐行解读:

  • 第1行定义了项目名为 adminsvr
  • 第3行定义了一个名为 SysTestReq 的结构, 其语法为 class 开头,(Message): 结尾
  • 第4行用为结构 SysTestReq 添加注释, 注释语法同 python
  • 第5行为结构定义了一个名为 saystring 的必填参数
  • 第7-9行同3-5行
  • 第11行用 with services(): 作为开始标记, 以下是定义 api 开始
  • 第12行定义了一个路径为/api/sys/testGET api, 其请求结构为 SysTestReq, 返回结构为 SysTestResp.

代码生成

可通过点击(1)资源管理器顶部和(2)工具栏中的 </>图标生成代码,也支持在(3)资源管理器中选中任意文件并右键中 niuhe idl 生成, (4) Command + Shift + P 快捷键中 输入 niuhe 查找 niuhe idl 生成 共4种方式触发代码生成。

方式1和3 方式2 方式4

使用以上方式中的任意一种生成项目基础代码后文件结构如下:

shell 复制代码
.
├── README.md ---- 说明文档
├── conf
│   └── adminsvr.yaml ---- 配置文件
├── makefile  ---- mac/linux 中的 make 定义文件
├── niuhe
│   └── all.niuhe ---- 项目入口
├── niuhe.log --- 生成 log, 如果生成出错, 可根据 log 定义位置
└── src
    └── adminsvr
        ├── app
        │   ├── api --- model 文件夹
        │   │   ├── protos
        │   │   │   └── gen_protos.go --- 自动生成文件
        │   │   └── views --- views 文件夹
        │   │       ├── gen_sys_views.go
        │   │       ├── init.go
        │   │       └── sys_views.go --- 具体入口
        │   └── common
        │       └── consts
        │           └── gen_consts.go -- 常量定义
        ├── config
        │   └── config.go --- conf/*yaml 定义读取文件
        ├── main.go  --- main 入口
        └── xorm --- xorm 定义文件夹, 结构为 model - dao - service
            ├── daos
            │   └── init.go
            ├── models
            │   └── models.go
            └── services
                └── init.go

运行程序

README.md 文件中包含了运行项目的基础说明, 我们先复制 mod 部分代码让程序运行起来 cd src/adminsvr && go mod init adminsvr && go mod tidy && go mod vendor && cd ../../ && make run。 顺利的话可见项目运行起来,此时在浏览器中输入 http://localhost:9999/api/sys/test/?say=hellow 得到如下内容:

json 复制代码
{"message":"Not Implemented","result":-1}

实现 Hello world

src/adminsvr/app/api/views/sys_views.go 文件代码如下

go 复制代码
package views

// Generated by niuhe.idl

import (
	"adminsvr/app/api/protos"

	"github.com/ma-guo/niuhe"
)

type Sys struct {
	_Gen_Sys
}

// 演示例子
func (v *Sys) Test_GET(c *niuhe.Context, req *protos.SysTestReq, rsp *protos.SysTestResp) error {
	return niuhe.NewCommError(-1, "Not Implemented")
}
func init() {
	GetModule().Register(&Sys{})
}

第18行即为我们访问得到的结果, 接下来我们修改方法实现实现 hello world, 修改后 16-19行代码为

go 复制代码
// 演示例子
func (v *Sys) Test_GET(c *niuhe.Context, req *protos.SysTestReq, rsp *protos.SysTestResp) error {
	rsp.Answer = req.Say + " world!"
	return nil
}

再次运行代码(make run)并访问http://localhost:9999/api/sys/test/?say=hellow 得到如下内容:

json 复制代码
{"data":{"answer":"hellow world!"},"result":0}

以上即实现了 niuhe 插件实现 从 idl 转译为 go 的初体验

相关推荐
梦想很大很大2 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰7 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘11 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤11 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto2 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想