go全棧開發框架bud,go語言中的ruby on rails
VSole2022-08-03 10:22:40
- 介紹
Bud是一個go語言編寫的全棧開發框架,類似ruby on rails,Bud的使命是降低構建、開發和維護web應用的成本。Bud提供了一整套文檔完善的、充分測試的工具來降低web應用開發成本。
- 安裝
curl -sf https://raw.githubusercontent.com/livebud/bud/main/install.sh | sh bud -h
- 創建web app
bud create hello cd hello ls go.mod node_modules/ package-lock.json package.json
不像其他全棧框架,bud生成的初始代碼非常少,再添加依賴之后,bud才會生成所有的代碼。
用bud run運行項目,開啟一個開發模式的Server:
bud run | Listening on http://0.0.0.0:3000

- 目錄結構
Bud提供了一個標準目錄結構:
$YOUR_APP ├─ bud ├─ controller ├─ internal ├─ public └─ view
- bud/ 這個目錄是創建的時候自動生成的,包含框架生成的代碼,偶爾會需要從這個目錄導入packages,但大部分時候都可以忽略它,建議不要放在版本控制器里
- controller/ 控制器目錄用來獲取http請求,并響應返回
- view/ 視圖目錄用來存放視圖文件
- public/ public目錄用來存放靜態資源
- internal/ 這個目錄不會被Bud框架引用,建議放這個應用特定的packages
- 控制器和路由
Bud的路由不同于傳統的go框架,它遵循一套約定:每個控制器對應一組標準路由,也可以自定義Action,Action和路由一一對應,下面看例子:
bud new controller post
這個命令會生成
controller/post/controller.go 此時這個文件里只能包含以下方法:

可以選擇實現任意方法,如果要新增一個自定義路由,則需要新增一個方法:
func (c *Controller) About(ctx context.Context) (string, error) {
return "hello", nil
}
這個方法有一個默認路由/about,首字母大寫的Action會自動獲得對應小寫的路由,首字母小寫的Action不會獲得路由。
- 請求和響應
解析請求框架會自動完成,可以在action參數里接收,也可以使用單獨的結構體接收,例如:
func (c *Controller) About(ctx context.Context, name string) (string, error) {
return fmt.Sprintf("hello %s", name), nil
}
type Input struct {
Name string
}
func (c *Controller) About(ctx context.Context, in *Input) (string, error) {
return fmt.Sprintf("hello %s", in.Name), nil
}
一個控制器如果沒有對應的視圖,總是返回json,例如:
func (c *Controller) Create() (id int, email string) {
return 10, "alice@livebud.com"
}
type Output struct {
ID int
Email string
}
func (c *Controller) Create() Output {
return Output{
ID: 10,
Email: "alice@livebud.com",
}
}
上述這兩種形式都將返回:
{
"id": 10,
"email": "alice@livebud.com"
}
- 視圖
視圖用來展示HTML頁面,bud默認使用svelte渲染視圖,svelte是一個高性能前端js框架。
$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
控制器中返回的值,如果有對應視圖文件,則值會被傳遞到視圖中:
<script>
export let users = [] //來自控制器
</script>
<h1>Users</h1>
<ul>
{#each users as user}
<li>{user.name} is {user.age} years old</li>
{/each}
</ul>
- 其他
Bud框架并沒有自己的ORM,用戶可自行選擇orm框架,通過依賴注入在控制器中使用。另外,還有全棧框架包含的特性,如錯誤處理、插件系統、數據驗證及安全、日志、隊列與定時任務、文件與存儲等都可以在官方文檔上找到。
VSole
網絡安全專家