Rumah > pembangunan bahagian belakang > Golang > Bina blog dengan golang

Bina blog dengan golang

WBOY
Lepaskan: 2023-05-16 16:23:37
asal
761 orang telah melayarinya

Dalam beberapa tahun kebelakangan ini, Golang (bahasa Go) secara beransur-ansur menjadi bahasa yang popular untuk pembangunan Internet kerana kelajuan larian yang cekap dan sintaks yang mudah Sebagai aplikasi Internet yang sangat popular, blog juga telah menunjukkan sepenuhnya kelebihan Golang. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Golang untuk membina blog yang mudah.

Langkah 1: Pasang Golang
Mula-mula, kita perlu memasang persekitaran Golang secara setempat. Anda boleh memuat turun versi terkini Golang dengan melawati laman web rasmi dan memasangnya mengikut arahan di laman web rasmi Saya tidak akan pergi ke butiran di sini. Selepas pemasangan selesai, kita perlu mengkonfigurasi pembolehubah persekitaran GOPATH.

Langkah 2: Pasang Gin
Untuk membina blog dengan lebih mudah, kita perlu menggunakan Gin, rangka kerja web yang ringan. Anda boleh menggunakan arahan berikut dalam terminal untuk memasang:
go get -u github.com/gin-gonic/gin
Selepas pemasangan selesai, kami perlu memperkenalkannya ke dalam projek kami.

Langkah 3: Reka bentuk pangkalan data
Seterusnya, kita perlu mereka bentuk pangkalan data untuk menyimpan kandungan blog kita. Kita boleh menggunakan pangkalan data hubungan seperti MySQL atau PostgreSQL, tetapi di sini kita memilih untuk menggunakan SQLite. Sebab untuk menggunakan SQLite ialah ia kecil dan mudah digunakan, dan tidak memerlukan memulakan pelayan yang berasingan. Anda boleh menggunakan arahan berikut dalam terminal untuk memasang SQLite:
go get -u github.com/mattn/go-sqlite3
Selepas pemasangan selesai, kami boleh mewujudkan sambungan pangkalan data melalui kod berikut:

db, err := sql.Open("sqlite3", "./blog.db")
if err != nil {
    panic(err)
}
defer db.Close()
Salin selepas log masuk

Kod di atas akan mula-mula panggil kaedah sql.Open() Sambung ke pangkalan data dan panggil kaedah db.Close() untuk melepaskan sumber pada penghujungnya. Anda boleh menetapkan laluan di mana fail data disimpan dengan mengubah suai parameter kedua. Di sini kami menamakan siaran jadual data blog Anda boleh menggunakan pernyataan SQL berikut untuk mencipta jadual data siaran:

CREATE TABLE posts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(64) NOT NULL,
    content TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Salin selepas log masuk

Pernyataan SQL di atas mencipta jadual data bernama siaran, termasuk id, tajuk, kandungan, created_at dan dikemas kini_di lima medan.

Langkah 4: Laksanakan penambahan, pemadaman, pengubahsuaian dan pertanyaan
Selepas memiliki pangkalan data, kita boleh mula melaksanakan fungsi penambahan, pemadaman, pengubahsuaian dan pertanyaan. Di sini, kami boleh mereka bentuk antara muka kami berdasarkan idea RESTful API. Dalam rangka kerja Gin, kami menggunakan empat kaedah HTTP POST, GET, PUT dan DELETE untuk sepadan dengan operasi tambah, pertanyaan, kemas kini dan padam masing-masing. Berikut ialah contoh penggunaan rangka kerja Gin:

package main

import (
    "database/sql"
    "net/http"

    "github.com/gin-gonic/gin"
    _ "github.com/mattn/go-sqlite3"
)

type post struct {
    ID        int    `json:"id"`
    Title     string `json:"title"`
    Content   string `json:"content"`
    CreatedAt string `json:"created_at"`
    UpdatedAt string `json:"updated_at"`
}

func main() {
    r := gin.Default()

    db, err := sql.Open("sqlite3", "./blog.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    r.GET("/posts", func(c *gin.Context) {
        var p []post
        rows, err := db.Query("SELECT * FROM posts")
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        defer rows.Close()

        for rows.Next() {
            var ps post
            rows.Scan(&ps.ID, &ps.Title, &ps.Content, &ps.CreatedAt, &ps.UpdatedAt)
            p = append(p, ps)
        }
        if err := rows.Err(); err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"data": p})
    })

    r.POST("/posts", func(c *gin.Context) {
        var p post
        if err := c.ShouldBindJSON(&p); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        result, err := db.Exec("INSERT INTO posts (title, content) VALUES (?, ?)", p.Title, p.Content)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        p.ID, err = result.LastInsertId()
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"data": p})
    })

    r.GET("/posts/:id", func(c *gin.Context) {
        var p post

        row := db.QueryRow("SELECT * FROM posts WHERE id = ?", c.Param("id"))
        err := row.Scan(&p.ID, &p.Title, &p.Content, &p.CreatedAt, &p.UpdatedAt)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"data": p})
    })

    r.PUT("/posts/:id", func(c *gin.Context) {
        var p post
        if err := c.ShouldBindJSON(&p); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        result, err := db.Exec("UPDATE posts SET title = ?, content = ? WHERE id = ?", p.Title, p.Content, c.Param("id"))
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        p.ID, err = result.LastInsertId()
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"data": p})
    })

    r.DELETE("/posts/:id", func(c *gin.Context) {
        _, err := db.Exec("DELETE FROM posts WHERE id = ?", c.Param("id"))
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"data": "Post deleted"})
    })

    r.Run(":8080")
}
Salin selepas log masuk

Kod di atas melaksanakan empat kaedah GET, POST, PUT dan DELETE, dan alamat permintaan yang sepadan ialah /posts, /posts/:id, / posts/ :id dan /posts/:id. Antaranya, kaedah GET digunakan untuk menanyakan semua artikel, kaedah POST digunakan untuk menambah artikel, kaedah GET (dengan parameter) digunakan untuk pertanyaan artikel dengan ID yang ditentukan, kaedah PUT digunakan untuk mengubah suai artikel, dan Kaedah DELETE digunakan untuk memadam artikel.

Langkah 5: Mulakan perkhidmatan
Selepas melengkapkan langkah di atas, kita boleh menggunakan arahan berikut dalam terminal untuk memulakan perkhidmatan:
go run main.go
Selepas perkhidmatan dimulakan dengan jayanya , kita boleh menggunakan pelayar Masukkan http://localhost:8080/posts untuk melihat semua artikel.

Ringkasan
Melalui langkah di atas, kami berjaya membina blog menggunakan Golang, dan menggunakan rangka kerja Gin dan pangkalan data SQLite untuk melaksanakan fungsi penambahan, pemadaman, pengubahsuaian dan pertanyaan data. Sudah tentu, ini hanyalah contoh yang sangat asas dan anda boleh memanjangkannya mengikut keperluan anda.

Atas ialah kandungan terperinci Bina blog dengan golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan