欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用Go語言標準庫實現(xiàn)Web服務之項目介紹

 更新時間:2023年05月21日 10:15:06   作者:LightSaid  
從本節(jié)開始將從后端到前端一步一步實現(xiàn)一個Go語言Web服務,后端除了MySQL驅(qū)動,全部使用Go語言標準庫來實現(xiàn)一個小型項目,本篇將簡單的介紹一下項目開發(fā)要準備的流程,感興趣的同學可以閱讀一下

我們將要創(chuàng)建一個什么項目呢?

我們要創(chuàng)建的項目是一個EBook電子書平臺,接受用戶注冊登錄瀏覽圖書,用戶可以購買圖書,系統(tǒng)自動將電子書(pdf、epub 等格式電子書)發(fā)送到用戶郵箱。這就是整個系統(tǒng)主線任務。

當然整個項目不是一蹴而就馬上編寫完成,而是分階段實現(xiàn),每個階段都有不同技術棧,像一個真實項目一樣迭代開發(fā)。

用戶可以瀏覽平臺所有電子書,管理員可以對圖書進行CRUD操作。

在第一階段,我將使用Go語言標準庫實現(xiàn)單表CRUD API 接口。

在這一個階段先創(chuàng)建一個電子書表book,使用 MySQL 5.7版本 先維護好book表的功能,繼而迭代開發(fā);建庫建表 SQL 語句如下:

CREATE DATABASE db_ebook; 
USE db_ebook;

CREATE TABLE book (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',
    isbn VARCHAR(13) NOT NULL COMMENT '國際標準書號',
    title VARCHAR(255) NOT NULL COMMENT '圖書名字',
    poster  VARCHAR(255) NOT NULL COMMENT '圖書封面圖地址',
    pages INT UNSIGNED NOT NULL COMMENT '總頁數(shù)',
    price DECIMAL(6, 2) UNSIGNED COMMENT '圖書單價',
    published_at DATE NOT NULL COMMENT '發(fā)售日期',
    created_at TIMESTAMP NOT NULL default NOW() COMMENT '創(chuàng)建時間',
    updated_at TIMESTAMP NOT NULL default NOW() COMMENT '更新時間',
    unique index unq_isbn(`isbn`)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT '圖書表';

項目目錄結(jié)構組織

在這一步,我將設計一個簡潔實用的代碼組織架構,符合Go語言哲學思想,所見即所得。

初始化項目,使用 Go Module 開發(fā);

mkdir -p $GOPATH/src/github.com/lightsaid/ebook
cd $GOPATH/src/github.com/lightsaid/ebook
go mod init github.com/lightsaid/ebook
code .

目錄結(jié)構

        ├── configs         配置文件,可以有多個,例如開發(fā)/生產(chǎn)環(huán)境配置
        │   └── app.json    
        ├── go.mod         
        ├── go.sum
        ├── internal       系統(tǒng)內(nèi)部邏輯在此處實現(xiàn)
        │   ├── app        app 要實現(xiàn)的api應用程序
        │   ├── config     加載配置
        │   ├── dbrepo     數(shù)據(jù)庫操作
        │   └── models     實體模型
        ├── main.go        入口函數(shù)
        ├── pkg            公共模塊,可以提供給其他項目使用的模塊
        │   └── logger     日志庫
        └── schema.sql

在Go中,internal 目錄是本項目內(nèi)部代碼,不提供給其他項目使用,而且不管internal嵌套在一級、二級、三級...都是同樣不允許外部項目訪問;Go在編譯的時候做了區(qū)分。如果你想詳細了解Go如何組織代碼可以參考這個項目 project-layout

在上面其中pkg目錄是存放公共模塊代碼,如核心業(yè)務沒有太多聯(lián)系輔助模塊,它可以提供給其他項目使用,盡管其他項目也不會用到??。

在這一階段,先來熱身一下,先編寫簡單的 logger 日志輸出功能和加載配置功能。 好在這一部分先介紹到這么多,下一節(jié)將開始編碼。

logger/logger.go

package logger
import (
    "log"
    "os"
)
var InfoLog *log.Logger
var ErrorfoLog *log.Logger
func SetGlobalLogger() {
    InfoLog = log.New(os.Stdout, "[INFO]\t", log.Ldate|log.Ltime)
    ErrorfoLog = log.New(os.Stdout, "[ERROR]\t", log.Ldate|log.Ltime|log.Lshortfile)
}

上面創(chuàng)建兩個log實例,并配置日志輸出前綴,和日期文件名等信息

app.json (端口根據(jù)自己實際配置)

{
    "env": "dev",
    "port": 9527,
    "dsn": "root:rootcc@tcp(127.0.0.1:3318)/db_ebook?charset=utf8mb4&parseTime=True",
    "maxOpenConns": 30,
    "maxIdleConns": 15,
    "maxIdleTime": "5m"
}

config/config.go

package config

import (
	"encoding/json"
	"fmt"
	"os"
	"time"

	"github.com/lightsaid/ebook/pkg/logger"
)

// AppConfig 應用程序配置
type AppConfig struct {
	Env          string `json:"env"`          // 環(huán)境參數(shù):dev | prod
	Port         int    `json:"port"`         // 服務端口
	DSN          string `json:"dsn"`          // 數(shù)據(jù)庫鏈接
	MaxOpenConns int    `json:"maxOpenConns"` // 數(shù)據(jù)庫最大鏈接數(shù)
	MaxIdleConns int    `json:"maxIdleConns"` // 數(shù)據(jù)庫鏈接最大空閑數(shù)
	MaxIdleTime  string `json:"maxIdleTime"`  // 數(shù)據(jù)庫鏈接最大空閑時間
}

// MaxIdleTimeToDuration 將 MaxIdleTime 轉(zhuǎn)換成 time.Duration 返回,如果轉(zhuǎn)換出錯,返回默認值
func (app *AppConfig) MaxIdleTimeToDuration() time.Duration {
	dur, err := time.ParseDuration(app.MaxIdleTime)
	if err != nil {
		logger.ErrorfoLog.Println("time.ParseDuration(app.MaxIdleTime) failed: " + err.Error())
		return time.Minute * 5
	}
	return dur
}

// LoadAppConfig 根據(jù)配置文件路徑加載配置
func LoadAppConfig(path string) (cfg AppConfig, err error) {
	var buf []byte
	buf, err = os.ReadFile(path)
	if err != nil {
		return
	}
	if err = json.Unmarshal(buf, &cfg); err != nil {
		return
	}

	return
}

func (a *AppConfig) Println() {
	if a.Env == "dev" {
		buf, _ := json.MarshalIndent(a, "", " ")
		fmt.Println(string(buf))
	}
}

在上面創(chuàng)建一個AppConfig結(jié)構體,并綁定json tag,這樣json.Unmarshal才能解碼。 在 Println 方法中 json.MarshalIndent 是格式化輸出json函數(shù)。上面格式輸出如圖:

這部分內(nèi)容分享到這里,下一節(jié)將初始化App路由。

到此這篇關于用Go語言標準庫實現(xiàn)Web服務之項目介紹的文章就介紹到這了,更多相關Go語言標準庫 實現(xiàn)Web服務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作

    go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作

    這篇文章主要介紹了go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go開發(fā)神器Air熱加載的安裝使用探究

    Go開發(fā)神器Air熱加載的安裝使用探究

    這篇文章主要介紹了Go開發(fā)神器Air熱加載使用實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang http請求封裝代碼

    golang http請求封裝代碼

    這篇文章主要介紹了golang http請求封裝代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言基礎go fmt命令使用示例詳解

    Go語言基礎go fmt命令使用示例詳解

    這篇文章主要為大家介紹了Go語言基礎go fmt命令的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Golang使用Channel組建高并發(fā)HTTP服務器

    Golang使用Channel組建高并發(fā)HTTP服務器

    Golang 作為一門高效的語言,在網(wǎng)絡編程方面表現(xiàn)也非常出色,這篇文章主要介紹了如何使用 Golang 和 Channel 組建高并發(fā) HTTP 服務器,感興趣的可以了解一下
    2023-06-06
  • go語言 bool類型的使用操作

    go語言 bool類型的使用操作

    這篇文章主要介紹了go語言 bool類型的使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Golang中interface接口的原理和使用技巧

    詳解Golang中interface接口的原理和使用技巧

    interface?接口在?Go?語言里面的地位非常重要,是一個非常重要的數(shù)據(jù)結(jié)構。本文主要介紹了Golang中interface接口的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • 解讀go在遍歷map過程中刪除成員是否安全

    解讀go在遍歷map過程中刪除成員是否安全

    在Go語言中,通過for range遍歷map時可以安全地刪除當前遍歷到的元素,因為遍歷過程中的刪除操作不會影響遍歷的進行,但需要注意,遍歷順序是不確定的,刪除元素不會導致程序錯誤,但可能會影響剩余元素的遍歷順序,在多線程環(huán)境下
    2024-09-09
  • go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    本文主要介紹了go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 從生成CRD到編寫自定義控制器教程示例

    從生成CRD到編寫自定義控制器教程示例

    這篇文章主要為大家介紹了從生成CRD到編寫自定義控制器的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論