歡迎回來!🙌 上一篇我們已經成功把伺服器跑起來,看到 Hello, TodoList!
。那只是熱身,今天直接上主菜:讓伺服器真的能「新增一個待辦事項」。
想像你對朋友說:
Todo
的資料結構/todos
的 APIcurl
或 Postman 測試,看到「新增成功」🎉步驟一:設計 Todo
資料結構
在 Go 裡,我們用 struct
(結構體)來描述「一張待辦卡片」的樣子。
type Todo struct {
ID int `json:"id"` // 任務編號
Title string `json:"title"` // 任務名稱,例如「寫數學作業」
Done bool `json:"done"` // 是否完成:true/false
}
json:"..."
叫做「標籤」,讓回傳的 JSON 欄位名稱更好看。步驟二:準備一個暫存空間(先不接資料庫)
先別急著上資料庫,我們先用記憶體放著就好。等功能跑順再升級。🧪
var todos []Todo // 用來裝所有任務
var nextID = 1 // 自動編號,每新增一次就加一
步驟三:寫「新增任務」API(POST /todos)
我們要做一條路由:POST /todos
。它會接收像這樣的 JSON:{"title": "寫數學作業"}
,幫你補上 ID
與 Done=false
,然後放進清單,最後把新增成功的任務回傳給你。
e.POST("/todos", func(c echo.Context) error {
// 1) 解析請求中的 JSON
var newTodo Todo
if err := c.Bind(&newTodo); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{
"error": "invalid request",
})
}
// 2) 自動加上 ID 與預設未完成
newTodo.ID = nextID
newTodo.Done = false
nextID++
// 3) 存進 slice
todos = append(todos, newTodo)
// 4) 回傳新增成功的任務
return c.JSON(http.StatusOK, newTodo)
})
📌 這段程式在做什麼:
{"title":"寫數學作業"}
)接起來。ID
與 Done=false
。todos
清單。步驟四:實際測試 API
go run main.go
curl
測試(或用 Postman 也行):curl -X POST http://localhost:1323/todos -H "Content-Type: application/json" -d '{"title":"寫數學作業"}'
你應該會收到回覆(數字可能不同):
{
"id": 1,
"title": "寫數學作業",
"done": false
}
再新增一筆:
curl -X POST http://localhost:1323/todos -H "Content-Type: application/json" -d '{"title":"倒垃圾"}'
回覆:
{
"id": 2,
"title": "倒垃圾",
"done": false
}
完整 main.go(可直接貼上執行)
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
var todos []Todo
var nextID = 1
func main() {
e := echo.New()
// 健康檢查 / 問候路由
e.GET("/hello", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, TodoList!")
})
// 新增任務:POST /todos
e.POST("/todos", func(c echo.Context) error {
var newTodo Todo
if err := c.Bind(&newTodo); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{
"error": "invalid request",
})
}
newTodo.ID = nextID
newTodo.Done = false
nextID++
todos = append(todos, newTodo)
return c.JSON(http.StatusOK, newTodo)
})
// 伺服器啟動
e.Logger.Fatal(e.Start(":1323"))
}
Todo
結構slice
暫存所有任務/todos
APIcurl
/ Postman 測試新增多筆任務下一步(預告)
接著我們要做:查詢所有任務(GET /todos)。沒有清單畫面只能一直新增,看不到內容,感覺就像「寫了日記卻翻不到書頁」。下一篇帶你把清單完整列出,一起把 TodoList 越做越像樣!📋✨
想先暖身?你可以試著自己加一條 GET /todos
路由,回傳 todos
陣列。