小工具知识网

当前位置: 首页 > 行业知识 > 原生GO开发的博客系统

行业知识

原生GO开发的博客系统

2026-11-01 08:02:57 来源:互联网转载

Go博客实战教程,是一个练手级项目教程,使用原生Go开发,未使用任何框架。

如何使���原生Go开发一个web项目

()

循序渐进,掌握编程思维和思路

初步具有工程思维,能适应一般的开发工作

()

1. 搭建项目

package mainimport ("encoding/json""log""net/http")type IndexData struct {Title string `json:"title"`Desc string `json:"desc"`}func index(w http.ResponseWriter,r *http.Request)  {w.Header().Set("Content-Type","application/json")var indexData IndexDataindexData.Title = "码神之路go博客"indexData.Desc = "现在是入门教程"jsonStr,_ := json.Marshal(indexData)w.Write(jsonStr)}func main()  {//程序入口,一个项目 只能有一个入口//web程序,http协议 ip portserver := http.Server{Addr: "127.0.0.1:8080",}http.HandleFunc("/",index)if err := server.ListenAndServe();err != nil{log.Println(err)}}

2. 响应页面

func indexHtml(w http.ResponseWriter,r *http.Request)  {t := template.New("index.html")viewPath, _ := os.Getwd()t,_ = t.ParseFiles(viewPath + "/template/index.html")var indexData IndexDataindexData.Title = "码神之路go博客"indexData.Desc = "现在是入门教程"err := t.Execute(w,indexData)fmt.Println(err)}func main()  {//程序入口,一个项目 只能有一个入口//web程序,http协议 ip portserver := http.Server{Addr: "127.0.0.1:8080",}http.HandleFunc("/",index)http.HandleFunc("/index.html",indexHtml)if err := server.ListenAndServe();err != nil{log.Println(err)}}
        Title hello mszlu blog!!{{.Title}} {{.Desc}}

3. 首页

3.1 页面解析

func index(w http.ResponseWriter,r *http.Request)  {var indexData IndexDataindexData.Title = "码神之路go博客"indexData.Desc = "现在是入门教程"t := template.New("index.html")//1. 拿到当前的路径path,_ := os.Getwd()//访问博客首页模板的时候,因为有多个模板的嵌套,解析文件的时候,需要将其涉及到的所有模板都进行解析home := path + "/template/home.html"header := path + "/template/layout/header.html"footer := path + "/template/layout/footer.html"personal := path + "/template/layout/personal.html"post := path + "/template/layout/post-list.html"pagination := path + "/template/layout/pagination.html"t,_ = t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination)//页面上涉及到的所有的数据,必须有定义t.Execute(w,indexData)}

3.2 首页数据格式定义

config/config.go

package configtype Viewer struct {Title stringDescription  stringLogo  stringNavigation  []stringBilibili stringAvatar stringUserName stringUserDesc string}type SystemConfig struct {AppName             stringVersion             float32CurrentDir          stringCdnURL stringQiniuAccessKey stringQiniuSecretKey stringValine boolValineAppid stringValineAppkey stringValineServerURL string}

models/category.go

package modelstype Category struct {Cid      intName     stringCreateAt stringUpdateAt string}

models/post.go

package modelsimport ("goblog/config""html/template""time")type Post struct {Pid        int    `json:"pid"`                // 文章IDTitle      string `json:"title"`            // 文章IDSlug       string `json:"slug"`              // 自定也页面 pathContent    string `json:"content"`        // 文章的htmlMarkdown   string `json:"markdown"`      // 文章的MarkdownCategoryId int    `json:"categoryId"` //分类idUserId     int    `json:"userId"`         //用户idViewCount  int    `json:"viewCount"`   //查看次数Type       int    `json:"type"`              //文章类型 0 普通,1 自定义文章CreateAt   time.Time `json:"createAt"`     // 创建时间UpdateAt   time.Time `json:"updateAt"`     // 更新时间}type PostMore struct {Pid          int    `json:"pid"`                    // 文章IDTitle        string `json:"title"`                // 文章IDSlug         string `json:"slug"`                  // 自定也页面 pathContent      template.HTML `json:"content"`            // 文章的htmlCategoryId   int    `json:"categoryId"`     // 文章的MarkdownCategoryName string `json:"categoryName"` // 分类名UserId       int    `json:"userId"`             // 用户idUserName     string `json:"userName"`         // 用户名ViewCount    int    `json:"viewCount"`       // 查看次数Type         int    `json:"type"`                  // 文章类型 0 普通,1 自定义文章CreateAt     string `json:"createAt"`UpdateAt     string `json:"updateAt"`}type PostReq struct {Pid        int    `json:"pid"`Title      string `json:"title"`Slug       string `json:"slug"`Content    string `json:"content"`Markdown   string `json:"markdown"`CategoryId int    `json:"categoryId"`UserId     int    `json:"userId"`Type       int    `json:"type"`}type SearchResp struct {Pid   int    `orm:"pid" json:"pid"` // 文章IDTitle string `orm:"title" json:"title"`}type PostRes struct {config.Viewerconfig.SystemConfigArticle PostMore}

models/home.go

package modelstype HomeData struct {config.ViewerCategorys []CategoryPosts []PostMoreTotal intPage intPages []intPageEnd bool}

4. 配置文件读取

config.toml:

[viewer]    Title = "码神之路Go语言博客"    Description = "码神之路Go语言博客"    Logo = "/resource/images/logo.png"    Navigation = ["首页","/", "GO语言","/golang", "归档","/pigeonhole", "关于","/about"]    Bilibili = "https://space.bilibili.com/473844125"    Zhihu = "https://www.zhihu.com/people/ma-shen-zhi-lu"    Avatar = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13147603927%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1647242040&t=c6108010ed46b4acebe18955acdd2d24"    UserName = "码神之路"    UserDesc = "长得非常帅的程序员"[system]    CdnURL = "https://static.mszlu.com/goblog/es6/md-assets"    QiniuAccessKey = "替换自己的"    QiniuSecretKey = "替换自己的"    Valine = true    ValineAppid = "替换自己的"    ValineAppkey = "替换自己的"    ValineServerURL = "替换自己的"
package configimport ("github.com/BurntSushi/toml""os")type TomlConfig struct {Viewer ViewerSystem SystemConfig}type Viewer struct {Title stringDescription  stringLogo  stringNavigation  []stringBilibili stringAvatar stringUserName stringUserDesc string}type SystemConfig struct {AppName             stringVersion             float32CurrentDir          stringCdnURL stringQiniuAccessKey stringQiniuSecretKey stringValine boolValineAppid stringValineAppkey stringValineServerURL string}var Cfg *TomlConfigfunc init()  {Cfg = new(TomlConfig)var err errorCfg.System.CurrentDir, err = os.Getwd()if err != nil {panic(err)}Cfg.System.AppName = "mszlu-go-blog"Cfg.System.Version = 1.0_,err = toml.DecodeFile("config/config.toml",&Cfg)if err != nil {panic(err)}}

5. 假数据-显示首页内容

package mainimport ("html/template""log""ms-go-blog/config""ms-go-blog/models""net/http""time")type IndexData struct {Title string `json:"title"`Desc string `json:"desc"`}func IsODD(num int) bool  {return num%2 == 0}func GetNextName(strs []string,index int) string{return strs[index+1]}func Date(layout string)  string{return time.Now().Format(layout)}func index(w http.ResponseWriter,r *http.Request)  {t := template.New("index.html")//1. 拿到当前的路径path := config.Cfg.System.CurrentDir//访问博客首页模板的时候,因为有多个模板的嵌套,解析文件的时候,需要将其涉及到的所有模板都进行解析home := path + "/template/home.html"header := path + "/template/layout/header.html"footer := path + "/template/layout/footer.html"personal := path + "/template/layout/personal.html"post := path + "/template/layout/post-list.html"pagination := path + "/template/layout/pagination.html"t.Funcs(template.FuncMap{"isODD":IsODD,"getNextName":GetNextName,"date":Date})t,err := t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination)if err != nil {log.Println(err)}//页面上涉及到的所有的数据,必须有定义var categorys = []models.Category{{Cid: 1,Name: "go",},}var posts = []models.PostMore{{Pid: 1,Title: "go博客",Content: "内容",UserName: "码神",ViewCount: 123,CreateAt: "2022-02-20",CategoryId:1,CategoryName: "go",Type:0,},}var hr = &models.HomeResponse{config.Cfg.Viewer,categorys,posts,1,1,[]int{1},true,}t.Execute(w,hr)}func main()  {//程序入口,一个项目 只能有一个入口//web程序,http协议 ip portserver := http.Server{Addr: "127.0.0.1:8080",}http.HandleFunc("/",index)http.Handle("/resource/",http.StripPrefix("/resource/",http.FileServer(http.Dir("public/resource/"))))if err := server.ListenAndServe();err != nil{log.Println(err)}}

后续内容在gitee上面: 传送门

记得给一个start 啊

使用 : 直接克隆地址到自己的go项目中,浏览器访问 127.0.0.1:8080可访问

上一篇:揭秘一淘下单立减未减真相,优惠背后的秘密!

下一篇:Spring 事务(详解)