亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go?Web實戰(zhàn)之創(chuàng)建項目及增加日志功能

 更新時間:2022年11月10日 09:42:45   作者:宇宙之一粟  
這篇文章主要為大家詳細介紹了Go?Web項目中如何實現(xiàn)創(chuàng)建項目及增加日志功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

從本文開始,我們來看一下如何從零搭建一個 Go 項目。

回顧一下基礎的 Go 項目運行過程

首先,新建一個 sports 的文件,然后鍵入此文件目錄下,選擇在終端中打開,使用如下命令初始化項目:

go mod init sports

然后,我們創(chuàng)建一個 main.go 的文件,寫入如下代碼:

package main

import "fmt"

func writeMessage() {
  fmt.Println("Let's Go")
}

func main() {
  writeMessage()
}

回到終端,編譯并執(zhí)行我們的項目:

go run .

就像之前第一次寫一個 HelloWorld 項目一樣,run 命令會成功編譯并執(zhí)行我們的 Println() 內(nèi)的字符串 Let's Go,輸出結(jié)果如下:

$ go run .
Let's Go

創(chuàng)建一些基本的項目功能

眾所周知,Web 應用有一些基礎的服務和功能如日志、文件配置等等。所以我們可以為 sports 項目提供一些基本的服務,這些服務將為運行網(wǎng)絡應用程序提供基礎。

創(chuàng)建日志接口 Logger

先來實現(xiàn)第一個服務器功能——日志。Go 標準庫中的 log 包為創(chuàng)建日志提供了一套非常用戶友好的基本功能,但在實際開發(fā)過程中,仍需要一些額外的功能來篩選一些信息詳情。

創(chuàng)建 sports/logging 文件夾,然后在這個文件夾下面創(chuàng)建一個 logging.go 文件,然后寫入如下代碼:

package logging

type LogLevel int

const (
    Trace LogLevel = iota
    Debug
    Information
    Warning
    Fatal
    None
)

type Logger interface {
    Trace(string)
    Tracef(string, ...interface{})

    Debug(string)
    Debugf(string, ...interface{})

    Info(string)
    Infof(string, ...interface{})

    Warn(string)
    Warnf(string, ...interface{})

    Panic(string)
    Panicf(string, ...interface{})
}

上面的代碼定義了 Logger 接口,并具體聲明了具體的日志消息的具體方法,分別有著不同的日志級別,LogLevel 從 Trace 到 Fatal 。值得注意的是也有一個無級別的 None, 意味著沒有日志輸出。

對于每個級別的重要性,Logger 接口定義兩個方法:

  • 一個用于接受簡單字符串的方法,如 Debug
  • 一個用于接收模板字符串和占位符值的方法,如 Debugf

將日志功能定義為接口的好處是:在需要更改或替換功能時,只需要更改實現(xiàn),我們的調(diào)用接口并不需要改變;接口也使得功能作為服務提供給應用程序。

Logger 接口的具體實現(xiàn)

日志接口定義好了之后,我們來創(chuàng)建具體的 Logger 接口的實現(xiàn)。

創(chuàng)建一個 logger_default.go 的文件,然后寫入如下的代碼:

package logging

import (
    "fmt"
    "log"
)

type DefaultLogger struct {
    minLevel     LogLevel
    loggers      map[LogLevel]*log.Logger
    triggerPanic bool
}

func (l *DefaultLogger) MinLogLevel() LogLevel {
    return l.minLevel
}

func (l *DefaultLogger) write(level LogLevel, message string) {
    if l.minLevel <= level {
        l.loggers[level].Output(2, message)
    }
}

func (l *DefaultLogger) Trace(msg string) {
    l.write(Trace, msg)
}

func (l *DefaultLogger) Tracef(template string, vals ...interface{}) {
    l.write(Trace, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Debug(msg string) {
    l.write(Debug, msg)
}

func (l *DefaultLogger) Debugf(template string, vals ...interface{}) {
    l.write(Debug, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Info(msg string) {
    l.write(Information, msg)
}

func (l *DefaultLogger) Infof(template string, vals ...interface{}) {
    l.write(Information, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Warn(msg string) {
    l.write(Warning, msg)
}

func (l *DefaultLogger) Warnf(template string, vals ...interface{}) {
    l.write(Warning, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Panic(msg string) {
    l.write(Fatal, msg)
    if l.triggerPanic {
        panic(msg)
    }
}

func (l *DefaultLogger) Panicf(template string, vals ...interface{}) {
    formattedMsg := fmt.Sprintf(template, vals...)
    l.write(Fatal, formattedMsg)
    if l.triggerPanic {
        panic(formattedMsg)
    }
}

NewDefaultLogger() 函數(shù)創(chuàng)建一個具有最小嚴重程度日志 DefaultLogger 和 log.Loggers 將消息寫入標準輸出。

最終我們的目錄結(jié)構(gòu)如下:

測試日志功能

為了做一個簡單的測試,我們可以修改最開始的 main() 函數(shù),以便查看日志功能是否能成功打印出日志消息,回到 main.go ,寫入如下代碼:

package main

import (
    // "fmt"
    "sports/logging"
)

func writeMessage(logger logging.Logger) {
    // fmt.Println("Let's Go")
    logger.Info("Let's Go, logger")
}

func main() {

    var logger logging.Logger = logging.NewDefaultLogger(logging.Information)
    writeMessage(logger)
}

由 NewDefaultLogger 創(chuàng)建的最小日志級別被設置為 Information,這意味著更低的日志級別(Trace 和 Debug)將被忽略,再次編譯和執(zhí)行 sports 項目,就會看到本地的日志輸出,可能你按照我的操作只會時間戳不同,如下:

$ go run .
11:46:55 INFO Let's Go, logger

終端結(jié)果如圖所示:

總結(jié)

到了本文的總結(jié)時刻了,為了學習 Go Web 項目,本文先回顧了一下 Go 項目的初始化構(gòu)建和運行過程,然后往我們的 sports 項目中添加了一個日志功能,逐步完善日志接口和實現(xiàn),最后在主函數(shù)中進行了一個簡單的日志輸出測試。

到此這篇關(guān)于Go Web實戰(zhàn)之創(chuàng)建項目及增加日志功能的文章就介紹到這了,更多相關(guān)Go Web增加日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 加速開發(fā):使用Go語言和Gin框架構(gòu)建Web項目的利器

    加速開發(fā):使用Go語言和Gin框架構(gòu)建Web項目的利器

    Go語言和Gin框架是構(gòu)建高性能Web項目的利器,Go語言的簡潔性和并發(fā)性,以及Gin框架的輕量級和快速路由能力,使開發(fā)者能夠快速構(gòu)建可靠的Web應用程序,需要的朋友可以參考下
    2023-09-09
  • Go標準庫-ServeMux的使用與模式匹配深入探究

    Go標準庫-ServeMux的使用與模式匹配深入探究

    這篇文章主要為大家介紹了Go標準庫-ServeMux的使用與模式匹配深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang中l(wèi)og包自定義輸出日志格式與寫入到文件

    golang中l(wèi)og包自定義輸出日志格式與寫入到文件

    這篇文章主要給大家介紹了關(guān)于golang中l(wèi)og包自定義輸出日志格式與寫入到文件的相關(guān)資料,日志輸出在任何項目中都極其重要,是有助于后續(xù)我們排查解決程序BUG,需要的朋友可以參考下
    2023-06-06
  • golang 實現(xiàn)并發(fā)求和

    golang 實現(xiàn)并發(fā)求和

    這篇文章主要介紹了golang 并發(fā)求和的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go語言區(qū)塊鏈學習調(diào)用以太坊

    go語言區(qū)塊鏈學習調(diào)用以太坊

    這篇文章主要為大家介紹了go語言區(qū)塊鏈學習如何調(diào)用以太坊的示例實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例

    Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例

    cap 是一個常用的內(nèi)建函數(shù),它用于獲取某些數(shù)據(jù)結(jié)構(gòu)的容量,本文主要介紹了Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • 詳解Golang如何比較兩個slice是否相等

    詳解Golang如何比較兩個slice是否相等

    開發(fā)中常會遇到需要比較兩個slice包含的元素是否完全相等的情況,我們通常會通過兩種方法去比較切片是否相等。這里通過幾個示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-11-11
  • go編譯so庫讓python引用編譯后沒有.h文件的問題

    go編譯so庫讓python引用編譯后沒有.h文件的問題

    有時python需要引用go的一些開源庫,這時就需要go編譯成python可調(diào)用的庫,本文給大家介紹了go編譯so庫讓python引用,編譯后沒有.h文件的問題,需要的朋友可以參考下
    2024-02-02
  • beego獲取ajax數(shù)據(jù)的實例

    beego獲取ajax數(shù)據(jù)的實例

    下面小編就為大家分享一篇beego獲取ajax數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • go與go mod命令使用方式以及遇到的問題

    go與go mod命令使用方式以及遇到的問題

    這篇文章主要介紹了go與go mod命令使用方式以及遇到的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論