Go?Web實(shí)戰(zhàn)之創(chuàng)建項(xiàng)目及增加日志功能
從本文開始,我們來看一下如何從零搭建一個(gè) Go 項(xiàng)目。
回顧一下基礎(chǔ)的 Go 項(xiàng)目運(yùn)行過程
首先,新建一個(gè) sports 的文件,然后鍵入此文件目錄下,選擇在終端中打開,使用如下命令初始化項(xiàng)目:
go mod init sports

然后,我們創(chuàng)建一個(gè) main.go 的文件,寫入如下代碼:
package main
import "fmt"
func writeMessage() {
fmt.Println("Let's Go")
}
func main() {
writeMessage()
}回到終端,編譯并執(zhí)行我們的項(xiàng)目:
go run .
就像之前第一次寫一個(gè) HelloWorld 項(xiàng)目一樣,run 命令會(huì)成功編譯并執(zhí)行我們的 Println() 內(nèi)的字符串 Let's Go,輸出結(jié)果如下:
$ go run . Let's Go
創(chuàng)建一些基本的項(xiàng)目功能
眾所周知,Web 應(yīng)用有一些基礎(chǔ)的服務(wù)和功能如日志、文件配置等等。所以我們可以為 sports 項(xiàng)目提供一些基本的服務(wù),這些服務(wù)將為運(yùn)行網(wǎng)絡(luò)應(yīng)用程序提供基礎(chǔ)。
創(chuàng)建日志接口 Logger
先來實(shí)現(xiàn)第一個(gè)服務(wù)器功能——日志。Go 標(biāo)準(zhǔn)庫中的 log 包為創(chuàng)建日志提供了一套非常用戶友好的基本功能,但在實(shí)際開發(fā)過程中,仍需要一些額外的功能來篩選一些信息詳情。
創(chuàng)建 sports/logging 文件夾,然后在這個(gè)文件夾下面創(chuàng)建一個(gè) 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 接口,并具體聲明了具體的日志消息的具體方法,分別有著不同的日志級(jí)別,LogLevel 從 Trace 到 Fatal 。值得注意的是也有一個(gè)無級(jí)別的 None, 意味著沒有日志輸出。
對(duì)于每個(gè)級(jí)別的重要性,Logger 接口定義兩個(gè)方法:
- 一個(gè)用于接受簡單字符串的方法,如
Debug - 一個(gè)用于接收模板字符串和占位符值的方法,如
Debugf
將日志功能定義為接口的好處是:在需要更改或替換功能時(shí),只需要更改實(shí)現(xiàn),我們的調(diào)用接口并不需要改變;接口也使得功能作為服務(wù)提供給應(yīng)用程序。
Logger 接口的具體實(shí)現(xiàn)
日志接口定義好了之后,我們來創(chuàng)建具體的 Logger 接口的實(shí)現(xiàn)。
創(chuàng)建一個(gè) 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)建一個(gè)具有最小嚴(yán)重程度日志 DefaultLogger 和 log.Loggers 將消息寫入標(biāo)準(zhǔn)輸出。
最終我們的目錄結(jié)構(gòu)如下:

測(cè)試日志功能
為了做一個(gè)簡單的測(cè)試,我們可以修改最開始的 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)建的最小日志級(jí)別被設(shè)置為 Information,這意味著更低的日志級(jí)別(Trace 和 Debug)將被忽略,再次編譯和執(zhí)行 sports 項(xiàng)目,就會(huì)看到本地的日志輸出,可能你按照我的操作只會(huì)時(shí)間戳不同,如下:
$ go run . 11:46:55 INFO Let's Go, logger
終端結(jié)果如圖所示:

總結(jié)
到了本文的總結(jié)時(shí)刻了,為了學(xué)習(xí) Go Web 項(xiàng)目,本文先回顧了一下 Go 項(xiàng)目的初始化構(gòu)建和運(yùn)行過程,然后往我們的 sports 項(xiàng)目中添加了一個(gè)日志功能,逐步完善日志接口和實(shí)現(xiàn),最后在主函數(shù)中進(jìn)行了一個(gè)簡單的日志輸出測(cè)試。
到此這篇關(guān)于Go Web實(shí)戰(zhàn)之創(chuàng)建項(xiàng)目及增加日志功能的文章就介紹到這了,更多相關(guān)Go Web增加日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言標(biāo)準(zhǔn)庫flag的具體實(shí)現(xiàn)
Go語言的flag庫提供了一套簡單而強(qiáng)大的接口,用于解析命令行參數(shù),本文主要介紹了Go語言標(biāo)準(zhǔn)庫flag的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別的流程步驟
驗(yàn)證碼主要用于區(qū)分人類用戶和機(jī)器程序,Tesseract 是一個(gè)開源的光學(xué)字符識(shí)別(OCR)引擎,支持多種語言和字體,并具有較高的識(shí)別準(zhǔn)確率,它由 Google 維護(hù),并且可以通過多種編程語言調(diào)用,本文給大家介紹了使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別的流程步驟2025-01-01
Golang WebView跨平臺(tái)的桌面應(yīng)用庫的使用
Golang WebView是一個(gè)強(qiáng)大的桌面應(yīng)用庫,本文介紹了Golang WebView的特點(diǎn)和使用方法,并列舉示例詳細(xì)的介紹了其在實(shí)際項(xiàng)目中的應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
淺談golang fasthttp踩坑經(jīng)驗(yàn)
本文主要介紹了golang fasthttp踩坑經(jīng)驗(yàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

