Golang Web框架还在用Gin吗,快试试全新框架Bud吧
ccwgpt 2024-09-18 12:19 31 浏览 0 评论
一、背景
在搭建Go语言的项目时,我们可能会习惯gin-gonic这样的框架。
这里来介绍一款目前简单易用,功能强大的开源框架 Bud。项目开源不到一年的时间,但是目前已经3.9K+ star,发展势头非常好。
Bud的地址:github.com/livebud/bud
Bud这个名字的由来是Buddy(伙伴)的缩写。作者希望好的框架就像安静的技术伙伴,可以提供很大的帮助。
二、使用教程
创建一个Bud项目非常简单。
环境配置
Node v14+ (官方会在v0.3版本的时候去除node js依赖)
// mac的话可以直接 brew install node
Go v1.17+
// 可以参考 Go语言安装和配置
首先执行这个命令。会远程拉一个脚本并执行 Bud 的安装
curl -sf https://raw.githubusercontent.com/livebud/bud/main/install.sh | sh
复制代码
然后使用命令 bud -h 验证安装是否成功。
创建项目
用 bud create 来创建一个项目,参数是指定的当前路径下的项目目录。
# 在 blog/ 目录下创建一个新的bud项目
bud create blog
复制代码
会生成这样的目录和文件
$ ls
go.mod node_modules/ package-lock.json package.json
复制代码
目录结构
Bud的标准目录结构如下所示:
$YOUR_APP
├─ bud
├─ controller
├─ internal
├─ public
└─ view
复制代码
bud 目录包含框架生成的代码。偶尔会需要从这个目录导入生成的包,但在大多数情况下可以忽略它的内容。 建议将此目录置于源代码控制之外。
controller 目录用于放置响应请求的代码。可用于为视图获取动态数据或提供 API。
internal 目录用于放置项目自身的代码,bud框架永远不会用到这个目录。
public 目录用于放置静态资源,比如图片和视频。
view 目录用于存储 Svelte 文件以显示给您的访问者。视图通常与控制器配对。
运行bud run可以启动项目。
# 在默认的 3000 端口启动 bud server
bud run
# 在指定端口启动 bud server
bud run --port=8080
# 以非热加载模式启动 bud server
bud run --hot=false
复制代码
三、功能与使用
###1. 网络路由
后端模块的请求处理逻辑,都是从controller开始。
当我们需要创建controller的时候,可以直接通过命令的方式创建。
# 创建一个叫作post的controller
bud new controller post
# 创建一个叫作post的controller,有index和show的function
bud new controller post index show
# 创建一个指定路由路径的controller
bud new controller post:/
复制代码
Bud框架的controller目录结构示例如下所示:
$YOUR_APP
└─ controller
├─ controller.go -> root controller
├─ posts
│ ├─ posts.go -> posts controller
│ └─ comments
│ └─ comments.go -> comments controller
└─ users
└─ users.go -> users controller
复制代码
users controller的示例如下,Bud框架对于controller的方法,都有对应的默认url路径。
package users
// Controller for /users
type Controller struct {}
// User type
type User struct {
ID int
Name string
Age int
}
// Index shows a list of users
// GET /users
func (c *Controller) Index() ([]*User, error) {}
// New user page
// GET /users/new
func (c *Controller) New() {}
// Create a new user
// POST /users
func (c *Controller) Create(name string, age int) (*User, error) {}
// Show a user
// GET /users/:id
func (c *Controller) Show(id int) (*User, error) {}
// Update a user
// PATCH /users/:id
func (c *Controller) Update(id int, name string, age int) error {}
// Delete a user
// DELETE /users/:id
func (c *Controller) Delete(id int) error {}
// Edit user page
// GET /users/:id/edit
func (c *Controller) Edit(id int) (*User, error) {}
复制代码
例如一个这样的请求
对于路径 /posts/:id/comments?order=xx&author=xx
GET /posts/10/comments?order=asc&author=Alice
复制代码
那么实际的GET请求参数是这样的:
{
"id": 10,
"order": "asc",
"author": "Alice"
}
复制代码
POST /posts/10/comments?author=Alice
{
"email": "alice@livebud.com"
}
复制代码
那么实际的POST请求参数是这样的:
{
"id": 10,
"author": "Alice",
"email": "alice@livebud.com"
}
复制代码
对于path参数和query参数有冲突的情况,例如:
POST /posts/10/comments?id=20&author=Alice
{
"id": 30,
"author": "Bob"
}
复制代码
那这时候,参数生效的优先级是这样的
1.路径值(最高优先级)
2.query参数
3.请求正文(最低优先级)
那么,最后生效的参数是这样的:
{
"id": 10,
"author": "Bob"
}
复制代码
bud框架对这一类的功能,已经有处理的逻辑了。并且对于错误参数的处理也已经有一套逻辑,不需要用户再去写这类逻辑。
2. 前端框架
bud使用的前端框架是Svelte.JS,当如1中所示创建controller和action之后,可以生成对应的svelte文件
$YOUR_APP
└─ view
├─ index.svelte -> Root index page
├─ posts
│ ├─ edit.svelte -> Edit post page
│ ├─ index.svelte -> Post index page
│ ├─ new.svelte -> New post page
│ ├─ show.svelte -> Show post page
│ └─ Post.svelte -> Post component (not rendered)
└─ users
├─ edit.svelte -> Edit user page
├─ index.svelte -> User index page
└─ show.svelte -> Show user page
复制代码
例如可以这样让controller和view交互:
controller/users/users.go
package users
type Controller struct {}
type User struct {
Name string
Age int
}
func (c *Controller) Index() []*User {
return []*User{
{"Matt", 32},
{"Mia", 31},
{"Mike", 26},
}
}
复制代码
view/users/index.svelte
<script>
export let users = []
</script>
<h1>Users</h1>
<ul>
{#each users as user}
<li>{user.name} is {user.age} years old</li>
{/each}
</ul>
复制代码
3. 扩展插件
插件以 bud- 前缀开头,看起来像任何其他 Bud 应用程序。例如,让我们创建一个插件来服务 Tailwind 的 preflight.css 文件
bud-tailwind/
├── public
│ └── preflight.css
├── go.mod
└── go.sum
复制代码
如果Bud项目的目录如下所示
$YOUR_APP
├── controller
│ └── post.go
├── public
│ └── favicon.ico
├── view
│ ├── index.svelte
│ └── show.svelte
├── go.mod
└── go.sum
复制代码
那通过执行命令 go get github.com/livebud/bud-tailwind之后,preflight.css就会安装到该bud项目中。
$YOUR_APP
├── controller
│ └── post.go
├── public
│ ├── favicon.ico
+ │ └── preflight.css
├── view
│ ├── index.svelte
│ └── show.svelte
├── go.mod
└── go.sum
复制代码
四、总结
Bud的特点:
- Bud 使用静态分析生成代码。这允许 Bud 提供更高级别的 API,这些 API 可以被编译成低级的高性能 Go 代码。
- 越来越多的捆绑代码生成器提供了特定于框架的功能。这些代码生成器与您可以自己编写的代码生成器没有什么不同。通过添加、自定义甚至丢弃这些代码生成器,让 Bud 成为您自己的。
- Bud 带来了它自己的依赖注入框架,它减少了你需要做的手动连接,并标准化了你开发模块化、可测试和可交换依赖项的方式。
但是目前Bud框架并没有自己的ORM,用户需要自行选择orm框架,通过依赖注入在控制器中使用。
另外,还有全栈框架包含的特性,如错误处理、依赖注入、数据验证及安全、文件与存储等都可以在官方文档上找到。
作者:张醒言
链接:https://juejin.cn/post/7125382825229942814
相关推荐
- Python+ Appium:Android手机连接与操作详解(附源码)
-
在移动端自动化测试领域,Appium一直是最热门的开源工具之一。今天这篇文章,我们聚焦Android端自动化测试的完整流程,从环境配置到代码实战,一步一步带你掌握用Python控制Android...
- 全平台开源即时通讯IM框架MobileIMSDK开发指南,支持鸿蒙NEXT
-
写在前面在着手基于MobileIMSDK开发自已的即时通讯应用前,建议以Demo工程为脚手架,快速上手MobileIMSDK!Demo工程主要用于演示SDK的API调用等,它位于SDK完整下载包的如下...
- 移动开发(一):使用.NET MAUI开发第一个安卓APP
-
对于工作多年的C#程序员来说,近来想尝试开发一款安卓APP,考虑了很久最终选择使用.NETMAUI这个微软官方的框架来尝试体验开发安卓APP,毕竟是使用VisualStudio开发工具,使用起来也...
- 在安卓系统上开发一款软件详细的流程
-
安卓app软件开发流程是一个系统而复杂的过程,涉及多个阶段和环节。以下是一个典型的安卓软件开发流程概述:1.需求分析目的:了解用户需求,确定APP的目标、功能、特性和预期效果。活动:开发团队与客户进...
- ArkUI-X在Android上使用Fragment开发指南
-
本文介绍将ArkUI框架的UIAbility跨平台部署至Android平台Fragment的使用说明,实现Android原生Fragment和ArkUI跨平台Fragment的混合开发,方便开发者灵活...
- Web3开发者必须要知道的6个框架与开发工具
-
在Web3领域,随着去中心化应用和区块链的兴起,开发者们需要掌握适用于这一新兴技术的框架与开发工具。这些工具和框架能够提供简化开发流程、增强安全性以及提供更好的用户体验。1.Truffle:Truff...
- Python开发web指南之创建你的RESTful APP
-
上回我们说到了:PythonFlask开发web指南:创建RESTAPI。我们知道了Flask是一个web轻量级框架,可以在上面做一些扩展,我们还用Flask创建了API,也说到了...
- python的web开发框架有哪些(python主流web框架)
-
python在web开发方面有着广泛的应用。鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题。为此,我特此对比较常见的几种框架从性能、使用感受以及应用情况进行一个粗略的分析。 1Dja...
- Qwik:革新Web开发的新框架(webview开源框架)
-
听说关注我的人,都实现了财富自由!你还在等什么?赶紧加入我们,一起走向人生巅峰!Qwik:革新Web开发的新框架Qwik橫空出世:一场颠覆前端格局的革命?是炒作还是未来?前端框架的更新迭代速度,如同...
- Python中Web开发框架有哪些?(python主流web框架)
-
Python为Web开发提供了许多优秀的框架。以下是一些流行的PythonWeb框架:1.Django:一个高级的Web框架,旨在快速开发干净、实用的Web应用。Django遵...
- WPF 工业自动化数据管控框架,支持热拔插 DLL与多语言实现
-
前言工业自动化开发中,设备数据的采集、处理与管理成为提升生产效率和实现智能制造的关键环节。为了简化开发流程、提高系统的灵活性与可维护性,StarRyEdgeFramework应运而生。该框架专注...
- [汇川PLC] 汇川IFA程序框架06-建立气缸控制FB块
-
前言:汇川的iFA要跟西门子对标啦,这可是新的选择!就在2月14日,汇川刚发布的iFA平台,一眼就能看出来是对标西门子的全集成自动化平台博途(TIAPortal)。这个平台能在同一个...
- 微软发布.NET 10首个预览版:JIT编译器再进化、跨平台开发更流畅
-
IT之家2月26日消息,微软.NET团队昨日(2月25日)发布博文,宣布推出.NET10首个预览版更新,重点改进.NETRuntime、SDK、libraries、C#、AS...
- 大模型部署革命:GGUF量化+vLLM推理的极致性能调优方案
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在官网-聚客AI学院大模型应用开发微调项目实践课程学习平台一、模型微调核心概念与技术演进1.1微调的本质与优势数学表达:1....
- 拓扑学到底在研究什么?(拓扑学到底在研究什么问题)
-
拓扑是“不量尺寸的几何学”,那么它的核心内容,主要方法是什么?如果你问罗巴切夫斯基,他会说“附贴性是物体的一个特殊的属性。如果我们把这个性质掌握,而把物体其他的一切属性,不问是本质的或偶然出现的,均不...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Python+ Appium:Android手机连接与操作详解(附源码)
- 全平台开源即时通讯IM框架MobileIMSDK开发指南,支持鸿蒙NEXT
- 移动开发(一):使用.NET MAUI开发第一个安卓APP
- 在安卓系统上开发一款软件详细的流程
- ArkUI-X在Android上使用Fragment开发指南
- Web3开发者必须要知道的6个框架与开发工具
- Python开发web指南之创建你的RESTful APP
- python的web开发框架有哪些(python主流web框架)
- Qwik:革新Web开发的新框架(webview开源框架)
- Python中Web开发框架有哪些?(python主流web框架)
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)