成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼

Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼

熱門標(biāo)簽:百度地圖標(biāo)注后傳給手機(jī) 評(píng)價(jià)高的400電話辦理 阿克蘇地圖標(biāo)注 電話機(jī)器人軟件免費(fèi) 外呼系統(tǒng)顯本地手機(jī)號(hào) 涿州代理外呼系統(tǒng) excel地圖標(biāo)注分布數(shù)據(jù) 壽光微信地圖標(biāo)注 外呼系統(tǒng)用什么卡

Go操作MySQL

安裝: go get -u github.com/go-sql-driver/mysql

GO語(yǔ)言的操作數(shù)據(jù)庫(kù)的驅(qū)動(dòng)原生支持連接池, 并且是并發(fā)安全的 標(biāo)準(zhǔn)庫(kù)沒有具體的實(shí)現(xiàn) 只是列出了一些需要的第三方庫(kù)實(shí)現(xiàn)的具體內(nèi)容

//第一次連接MySQL成功
package main

import (
 "database/sql"
 _ "github.com/go-sql-driver/mysql"   // _想當(dāng)于init()初始化
 "log"
)

func main() {
 // root 用戶名 1qa2ws3ed是密碼  后邊的書ip:port  gouse 庫(kù)名
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"
 db, err := sql.Open("mysql", dsn)
 if err != nil {
  panic(err)
 }
 // ping是嘗試連接MySQL數(shù)據(jù)庫(kù)
 
 if err = db.Ping(); err != nil{
  panic(err)
 }
 log.Fatalln("Mysql數(shù)據(jù)庫(kù)連接成功")

}

Go調(diào)用MySQL封裝成函數(shù)

package main

import (
 "database/sql"
 "encoding/json"
 "fmt"
 _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func InitDB() (err error) {
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"

 db, err = sql.Open("mysql", dsn)
 CheckErr(err)

 err = db.Ping()
 CheckErr(err)
 fmt.Println("數(shù)據(jù)庫(kù)連接成功...")
 // 設(shè)置數(shù)據(jù)庫(kù)連接池最大連接數(shù)
 db.SetConnMaxLifetime(10)

 //設(shè)置最大閑置連接數(shù)
 db.SetMaxIdleConns(5)

 return
}

type data struct {
 Username string `json:"username"`
 Password string `json:"password"`
}


func main()  {
 err := InitDB()
 CheckErr(err)

 query, err := db.Query("select username, password from test")
 CheckErr(err)

 for query.Next(){
  line := data{}
  // 查詢數(shù)據(jù)的時(shí)候必須要調(diào)用scan方法如果 沒有 使用scan  連接通道一直保持連接 無(wú)法釋放連接  
  _ = query.Scan(line.Username, line.Password)
  fmt.Println(line)
  dataDic := map[string]string{
   "username": line.Username,
   "password": line.Password,
  }
  marshal, _ := json.Marshal(dataDic)
  fmt.Println(string(marshal))
 }
}

func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

GO—MySQL的增刪改查

package main

import (
 "database/sql"
 "encoding/json"
 "fmt"
 "time"

 _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

// InitDB 數(shù)據(jù)庫(kù)連接初始化
func InitDB() (err error) {
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"

 db, err = sql.Open("mysql", dsn)
 CheckErr(err)

 err = db.Ping()
 CheckErr(err)
 fmt.Println("數(shù)據(jù)庫(kù)連接成功...")
 // 設(shè)置數(shù)據(jù)庫(kù)連接池最大連接數(shù)
 db.SetConnMaxLifetime(10)

 //設(shè)置最大閑置連接數(shù)
 db.SetMaxIdleConns(5)

 return

}

type data struct {
 Username string `json:"username"`
 Password string `json:"password"`
}

// SelectQuery 查詢函數(shù)
func SelectQuery() {
 sqlStr := "select username, password from test where id > ?"
 query, err := db.Query(sqlStr, 1)
 CheckErr(err)
 defer query.Close()

 fmt.Printf("現(xiàn)在是北京時(shí)間 %s , 你今天進(jìn)步了嗎?\n", time.Now().Format("2006-01-02 15:04:05"))

 for query.Next() {
  line := data{}
  // 查詢數(shù)據(jù)的時(shí)候必須要調(diào)用scan方法如果 沒有 使用scan  連接通道一直保持連接 無(wú)法釋放連接
  _ = query.Scan(line.Username, line.Password)
  //fmt.Println(line)
  dataDic := map[string]string{
   "username": line.Username,
   "password": line.Password,
  }
  marshal, _ := json.Marshal(dataDic)
  fmt.Printf("查詢到的數(shù)據(jù)為 %s\n", string(marshal))
 }
}

// InsertQuery 插入數(shù)據(jù)
func InsertQuery() {
 // sql 語(yǔ)句
 sqlStr := `insert into test (username,password) values ("kuQi", "123qwe")`
 result, err := db.Exec(sqlStr)
 CheckErr(err)
 id, err := result.LastInsertId()
 CheckErr(err)
 fmt.Printf("插入成功數(shù)據(jù)的id為 %v", id)
}

// UpdateQuery 更新數(shù)據(jù)函數(shù)
func UpdateQuery(dataField string, user string) {
 sqlStr := `update test set password=? where username=?`
 result, err := db.Exec(sqlStr, dataField, user)
 CheckErr(err)
 rowsAffected, err := result.RowsAffected()
 CheckErr(err)
 fmt.Printf("被更新字段的id為%d\n", rowsAffected)

}

// DeleteQuery 刪除
func DeleteQuery(id int) {
 sqlStr := `delete from test where id=?`
 result, err := db.Exec(sqlStr, id)
 CheckErr(err)
 rowsAffected, err := result.RowsAffected()
 CheckErr(err)
 if rowsAffected == 0 {
  fmt.Printf("沒有匹配到要?jiǎng)h除的id=%d數(shù)據(jù)", id)
  return
 }
 fmt.Printf("刪除數(shù)據(jù)庫(kù)的id為%d", id)

}

//CheckErr 異常捕獲函數(shù)
func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

// main 主函數(shù) 所有函數(shù)的入口
func main() {
 err := InitDB()
 CheckErr(err)

 //InsertQuery()
 UpdateQuery("hahaGolang123", "kuQi")
 SelectQuery()
 DeleteQuery(5)
}

MySQL的預(yù)處理

什么是預(yù)處理?
普通SQL語(yǔ)句執(zhí)行過(guò)程:
 1.客戶端對(duì)SQL語(yǔ)句進(jìn)行占位符的替換得到了完整的SQL語(yǔ)句
 2.客戶端發(fā)送完整SQL語(yǔ)句到MySQL服務(wù)端
 3.MySQL服務(wù)端執(zhí)行完整的SQL語(yǔ)句并將結(jié)果返回終端

預(yù)處理的執(zhí)行過(guò)程
 1.先把SQL語(yǔ)句拆分成兩部分,SQL語(yǔ)句部分和參數(shù)部分
 2.先把SQL語(yǔ)句部分發(fā)送給MySQL服務(wù)端進(jìn)行SQL預(yù)處理
 3.然后參數(shù)部分發(fā)送給MySQL服務(wù)端,MySQL對(duì)SQL語(yǔ)句進(jìn)行拼接
 4.MySQL服務(wù)端執(zhí)行完整的SQL語(yǔ)句返回結(jié)果

為什么要進(jìn)行預(yù)處理?
  1.為了優(yōu)化MySQL服務(wù)器重復(fù)執(zhí)行SQL的方法??梢詧?zhí)行服務(wù)器的性能,提前讓服務(wù)器編譯,一次編譯多次執(zhí)行,節(jié)省后續(xù)重復(fù)編譯的成本
  2.并且避免SQL注入

Go實(shí)現(xiàn)MySQL預(yù)處理

// prepare方法現(xiàn)將SQL發(fā)送到MySQL服務(wù)端, 返回一個(gè)準(zhǔn)備好的狀態(tài)用于之后的查詢和命令。返回值可以同時(shí)執(zhí)行多個(gè)查詢和命令  ; 命令也就是SQL語(yǔ)句
// PrepareInsert 預(yù)處理執(zhí)行插入語(yǔ)句
func PrepareInsert() {

 defer wg.Done()
 sqlStr := `insert into test (username, password) values (?, ?)`
 // - 預(yù)處理 stmt 就是編譯好的sql語(yǔ)句 之后直接傳遞參數(shù)即可
 stmt, err := db.Prepare(sqlStr)
 var u1 = uuid.Must(uuid.NewV4())
 CheckErr(err)
 defer stmt.Close()
 i := rand.Int()

 username := fmt.Sprintf("yonghuming%d", i)
 result, err := stmt.Exec(username, u1.String()[:10])
 CheckErr(err)
 rowsAffected, err := result.LastInsertId()
 CheckErr(err)
 fmt.Printf("成功插入id=%d條數(shù)據(jù)\n", rowsAffected)
}

Go語(yǔ)言實(shí)現(xiàn)MySQL實(shí)現(xiàn)事務(wù)操作

// go語(yǔ)言中使用一下三個(gè)方法實(shí)現(xiàn)MySQL中的事務(wù)操作, 開始事務(wù)
func (db *DB) Begin()(*Tx, error)

// 提交事務(wù)  相當(dāng)與Python中的conn.commit()
func (tx *Tx) Commit() error   

// 回滾事務(wù)
func (tx *Tx) Rollback() error

package main

import (
 "database/sql"
 "fmt"

 _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

type data struct {
 Username string `json:"username"`
 Password string `json:"password"`
}

// InitDB 數(shù)據(jù)庫(kù)連接初始化
func InitDB() (err error) {
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"

 db, err = sql.Open("mysql", dsn)
 CheckErr(err)

 err = db.Ping()
 CheckErr(err)
 fmt.Println("數(shù)據(jù)庫(kù)連接成功...")
 // 設(shè)置數(shù)據(jù)庫(kù)連接池最大連接數(shù)
 db.SetMaxOpenConns(100)

 //設(shè)置最大閑置連接數(shù)
 db.SetMaxIdleConns(5)

 return

}

//CheckErr 異常捕獲函數(shù)
func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

// TranSaCtIon MySQL的事務(wù)操作
func TranSaCtIon() {
 // 開啟事務(wù)
 tx, err := db.Begin()
 CheckErr(err)

 // 執(zhí)行多個(gè)SQL操作
 sqlStr := `update test set id=id+100000 where password=?`
 result, err := tx.Exec(sqlStr, "07f70f7e-4")
 CheckErr(err)
 id, err := result.LastInsertId()
 if err != nil {
  // 語(yǔ)句回滾
  err := tx.Rollback()
  fmt.Println("事務(wù)回滾")
  CheckErr(err)

 }
 fmt.Printf("修改后的id為%d\n", id)

}

func main() {
 err := InitDB()
 CheckErr(err)
 TranSaCtIon()
}

sqlx使用

第三方庫(kù)sqlx能夠簡(jiǎn)化操作,提高開發(fā)效率

安裝go get github.com/jmoiron/sqlx

package main

import (
 "fmt"

 _ "github.com/go-sql-driver/mysql"
 "github.com/jmoiron/sqlx"
)

var db *sqlx.DB

// InitDB 數(shù)據(jù)庫(kù)初始化
func InitDB() (err error) {
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"
 db, err = sqlx.Connect("mysql", dsn)
 CheckErr(err)
 db.SetMaxOpenConns(50)
 db.SetMaxIdleConns(10)
 fmt.Println("goUse 數(shù)據(jù)庫(kù)連接成功")
 return
}

//CheckErr 異常捕獲函數(shù)
func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

func main() {
 err := InitDB()
 CheckErr(err)
}

sqlx相較于原生的sql庫(kù)好處在于 查詢的時(shí)候sql原生的需要next scan 回調(diào)獲取結(jié)果

sqlx 查詢只需要定義一個(gè)存儲(chǔ)的變量 然后自動(dòng)就會(huì)將查詢的出來(lái)的值放入變量中

package main

import (
 "encoding/json"
 "fmt"

 _ "github.com/go-sql-driver/mysql"
 "github.com/jmoiron/sqlx"
)

var db *sqlx.DB

type user struct {
 ID       int    `json:"id"`
 Username string `json:"username"`
 Password string `json:"password"`
}

// InitDB 數(shù)據(jù)庫(kù)初始化
func InitDB() (err error) {
 dsn := "root:1qa2ws3ed@tcp(127.0.0.1:3306)/gouse"
 // Connect 就是連接的同時(shí)db.ping()一下
 db, err = sqlx.Connect("mysql", dsn)
 CheckErr(err)
 db.SetMaxOpenConns(50)
 db.SetMaxIdleConns(10)
 fmt.Println("goUse 數(shù)據(jù)庫(kù)連接成功")
 return
}

// SelectDB 查詢單條數(shù)據(jù)的方法
func SelectDB() {
 sqlStr := `select * from test where id=?`
 var data user
 _ = db.Get(data, sqlStr, 990)
 //CheckErr(err)
 fmt.Printf("%#v\n", data)
 marshal, err := json.Marshal(data)
 CheckErr(err)
 fmt.Println(string(marshal))
}

// ManySelect 查詢多條數(shù)據(jù)方法
func ManySelect() {
 sqlStr := `select * from test where id  ?`
 var dataList []user
 err := db.Select(dataList, sqlStr, 1000)
 CheckErr(err)
 //fmt.Println(dataList)
 marshal, err := json.Marshal(dataList)
 CheckErr(err)
 fmt.Println(string(marshal))
}

//CheckErr 異常捕獲函數(shù)
func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

func main() {
 err := InitDB()
 CheckErr(err)
 SelectDB()
 ManySelect()

}

Go操作Redis

安裝go get -u github.com/go-redis/redis

package main

import (
 "fmt"

 "github.com/go-redis/redis"
)

var redisDB *redis.Client

// InitRedisDB redis數(shù)據(jù)庫(kù)初始化
func InitRedisDB() (err error) {

 redisDB = redis.NewClient(redis.Options{
  Addr:     "127.0.0.1:6379",
  Password: "",
  DB:       0,
 })
 _, err = redisDB.Ping(redisDB.Context()).Result()
 CheckErr(err)
 fmt.Println("redis 連接成功")
 return
}

//CheckErr 異常捕獲函數(shù)
func CheckErr(err error) {
 if err != nil {
  fmt.Println(err)
  panic(err)
 }
}

func main() {
 _ = InitRedisDB()
}

  • set(key, value):給數(shù)據(jù)庫(kù)中名稱為key的string賦予值value
  • get(key):返回?cái)?shù)據(jù)庫(kù)中名稱為key的string的value
  • getset(key, value):給名稱為key的string賦予上一次的value
  • mget(key1, key2,…, key N):返回庫(kù)中多個(gè)string的value
  • setnx(key, value):添加string,名稱為key,值為value
  • setex(key, time, value):向庫(kù)中添加string,設(shè)定過(guò)期時(shí)間time
  • mset(key N, value N):批量設(shè)置多個(gè)string的值
  • msetnx(key N, value N):如果所有名稱為key i的string都不存在
  • incr(key):名稱為key的string增1操作
  • incrby(key, integer):名稱為key的string增加integer
  • decr(key):名稱為key的string減1操作
  • decrby(key, integer):名稱為key的string減少integer
  • append(key, value):名稱為key的string的值附加value
  • substr(key, start, end):返回名稱為key的string的value的子串

NSQ分布式消息隊(duì)列

NSQ是目前比較流行的一個(gè)分布式消息隊(duì)列,下面主要是NSQ及GO語(yǔ)言如何操作NSQ

NSQ是GO語(yǔ)言編寫的一個(gè)開源的實(shí)時(shí)分布式內(nèi)存消息隊(duì)列, 其性能十分優(yōu)異, NSQ的優(yōu)勢(shì)有:

​ 1.NSQ提倡分布式和擴(kuò)散的拓?fù)?,沒有單點(diǎn)故障,支持容錯(cuò)和高可用性,并提供可靠的消息交付保證

​ 2.NSQ支持橫向擴(kuò)展, 沒有任何集中式代理

​ 3.NSQ易于配置和部署,并且內(nèi)置了管理界面

安裝go get -u github.com/nsqio/go-nsq

Context

在Go HTTP 包的server中,每一個(gè)請(qǐng)求都在對(duì)應(yīng)著一個(gè)響應(yīng),請(qǐng)求處理函數(shù)通常會(huì)啟動(dòng)額外的goroutine用來(lái)訪問(wèn)后端的服務(wù),比如數(shù)據(jù)庫(kù)和rpc服務(wù),用來(lái)處理一個(gè)請(qǐng)求的goroutine通常需要訪問(wèn)一些與請(qǐng)求特定的數(shù)據(jù),比如終端的身份認(rèn)證信息、驗(yàn)證相關(guān)的token、請(qǐng)求和截止時(shí)間。當(dāng)一個(gè)請(qǐng)求被取消或超時(shí)時(shí),所有用來(lái)處理該請(qǐng)求的goroutine都應(yīng)該迅速退出,然后系統(tǒng)才能釋放這些goroutine

如何優(yōu)雅的結(jié)束goroutine釋放資源

// 通道版本
package main

import (
 "fmt"
 "sync"
 "time"
)

var wg sync.WaitGroup

func worker(exitChan -chan struct{}) {
 defer wg.Done()
Test:
 for {
  fmt.Println("worker")
  time.Sleep(time.Second)
  select {
  case -exitChan:
   break Test
  default:
  }

 }

}

func main() {
 wg.Add(1)
 c := make(chan struct{})

 go worker(c)
 time.Sleep(10 * time.Second)
 c - struct{}{}
 close(c)
 wg.Wait()
 fmt.Println("Over")

}
// Context版本
package main

import (
 "context"
 "fmt"
 "sync"
 "time"
)

var wg sync.WaitGroup

func worker(ctx context.Context) {
 defer wg.Done()
Test:
 for {
  fmt.Println("worker")
  time.Sleep(time.Second)
  select {
  case -ctx.Done():
   break Test
  default:
  }

 }

}

func main() {
 wg.Add(1)
 ctx, cancelFunc := context.WithCancel(context.Background())

 go worker(ctx)
 time.Sleep(10 * time.Second)

 cancelFunc()
 wg.Wait()
 fmt.Println("Over")
}

如果goroutine開啟了新的goroutine,只需要將ctx傳入到新的goroutine中即可

Background() 和 TODO()

go內(nèi)置兩個(gè)函數(shù): Background() 和TUDO(),這兩個(gè)函數(shù)分別返回了一個(gè)實(shí)現(xiàn)了context接口的background和todo. 我們代碼中最開始都是以這兩個(gè)內(nèi)置的上下文對(duì)象作為最頂層的partent context,衍生出更多的子上下文對(duì)象。

backgroud() 主要用于main函數(shù),初始化以及代碼測(cè)試,作為context這個(gè)樹結(jié)構(gòu)的最頂層context,也就是跟context。

todo(),他目前還不知道能干點(diǎn)啥?

使用context的注意事項(xiàng)

  • 推薦以參數(shù)顯示傳遞context
  • 以context作為參數(shù)的函數(shù)方法,應(yīng)該把context作為第一個(gè)參數(shù)
  • 給一個(gè)函數(shù)傳遞context的時(shí)候,不要nil,如果不知道傳遞什么,就使用context.TODO()
  • context是并發(fā)安全的,可以隨意在多個(gè)goroutine中傳遞

log標(biāo)準(zhǔn)庫(kù)

log包定義了Logger類型, 該類型提供了一些格式化輸出的方法。本包也提供了一個(gè)預(yù)定義的標(biāo)準(zhǔn)logger,可以通過(guò)調(diào)用函數(shù)Print系列,fatal系列和panic系列來(lái)使用,比自行創(chuàng)建的logger對(duì)象更容易使用。

package main

import "log"

func main() {
 log.Println("這是第一條工作日志")

 v := "THIS is worker log"
 log.Printf("%#v\n", v)
 // Fatal將會(huì)值寫入信息之后,執(zhí)行exit(1)
 log.Fatal("之后寫一萬(wàn)行代碼 我也不執(zhí)行了哦")

 // 可以通過(guò)log.Panic 引發(fā)異常 會(huì)將日志寫入之后引發(fā)異常
 log.Panic("測(cè)試panic的日志")

}

flag選項(xiàng)(日志輸出內(nèi)容設(shè)置)

log標(biāo)準(zhǔn)庫(kù)提供了如下的flag選項(xiàng),他們是一系列定義好的常量。

const (
 Ldate = 1  iota
  Ltime
  Lmicroseconds
  Llongfile
  Lshortfile
  LUTC
  LstdFlags = Ldate | Ltime
)



package main
import "log"
func main() {
    // 設(shè)置默認(rèn)附加的內(nèi)容 
  log.SetFlags(log.Llongfile | log.Ltime)
    // 設(shè)置日志前綴
  log.SetPrefix("[go_log] ")
  log.Println("測(cè)試日志")

}
output>>>
[go_log] 19:02:14 /Users/mac/GolandProjects/src/day02/go_log庫(kù)/main.go:19: 測(cè)試日志

配置日志輸出位置

setoutput函數(shù)用來(lái)設(shè)置logger的輸出目的地,默認(rèn)是標(biāo)準(zhǔn)錯(cuò)誤輸出

package main

import (
 "log"
 "os"
)

func main() {

 file, err := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
 if err != nil {
  log.Panic("文件打開失敗")
 }
  // 設(shè)置了寫入文件 日志內(nèi)容就不會(huì)打印到終端了
 log.SetOutput(file)
 log.SetFlags(log.Llongfile | log.Ltime)
 log.SetPrefix("[go_log] ")
 log.Println("測(cè)試日志")

}

我們可以定義一個(gè)init初始化函數(shù) 將log全部配置好 這樣更加標(biāo)準(zhǔn)化

第三方日志庫(kù)logrus的使用

logrus是GO結(jié)構(gòu)化的logger 與上邊的logger標(biāo)準(zhǔn)庫(kù)完全兼容

安裝logrusgo get github.com/sirupsen/logrus

package main

import (
 log "github.com/sirupsen/logrus"
)

func main() {
 log.WithFields(log.Fields{
  "animals": "dog",
  "time":    log.FieldKeyTime,
 }).Info("這是啥")
}

日志級(jí)別

Trace、debug、info、warning、error、fatal、panic

 log.Trace("跟蹤?")
 log.Debug("Debug?")
 log.Info("信息")
 log.Warn("警告?")
 log.Error("Something failed but I'm not quitting.")
 // 記完日志后會(huì)調(diào)用os.Exit(1) 
 log.Fatal("Bye.")
 // 記完日志后會(huì)調(diào)用 panic() 
 log.Panic("I'm bailing.")

日志記錄

package main

import (
 "os"
 "time"

 log "github.com/sirupsen/logrus"
)

func main() {
 file, err := os.OpenFile("logrustest.log", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
 if err != nil {
  log.Panicln(err)
 }
 log.SetOutput(file)
 for i := 0; i  100; i++ {
  log.WithFields(log.Fields{
   "animals": "dog",
   "Countey": "China",
   "City":    "BeiJing",
  }).Info("這是啥")
  time.Sleep(time.Second)
 }

 log.Trace("跟蹤?")
 log.Info("信息")
 log.Warn("警告?")
 // 設(shè)置日志級(jí)別, 會(huì)記錄info以上級(jí)別(warn error fatal panic)
 log.SetLevel(log.InfoLevel)

}

>>>結(jié)果
time="2021-02-04T12:00:15+08:00" level=info msg="這是啥" City=BeiJing Countey=China animals=dog
time="2021-02-04T12:00:17+08:00" level=info msg="這是啥" City=BeiJing Countey=China animals=dog
time="2021-02-04T12:00:18+08:00" level=info msg="這是啥" City=BeiJing Countey=China animals=dog
time="2021-02-04T12:00:19+08:00" level=info msg="這是啥" City=BeiJing Countey=China animals=dog

日志的條目除了使用withfield 和withfields添加的相關(guān)日志,還有一些默認(rèn)添加的日志字段

time 記錄日志的時(shí)間戳 msg 記錄日志信息 level記錄日志級(jí)別

日志格式化

logrus內(nèi)置一下兩種日志格式化程序

logrus.TextFormatter logrus.JSONFormatter

log.SetFormatter(log.JSONFormatter{})

追蹤函數(shù)

 log.SetReportCaller(true)

這樣就會(huì)將哪個(gè)文件哪一行 都記錄下來(lái)  但是不是特殊需求無(wú)需開啟這個(gè) 因?yàn)闀?huì)增加性能開

到此這篇關(guān)于Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼的文章就介紹到這了,更多相關(guān)Go語(yǔ)言操作數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • go語(yǔ)言靜態(tài)庫(kù)的編譯和使用方法
  • Go語(yǔ)言-為什么返回值為接口類型,卻返回結(jié)構(gòu)體
  • Go語(yǔ)言利用ssh連接服務(wù)器的方法步驟
  • 詳解用Go語(yǔ)言實(shí)現(xiàn)工廠模式(Golang經(jīng)典編程案例)
  • Go語(yǔ)言reflect.TypeOf()和reflect.Type通過(guò)反射獲取類型信息
  • go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易比特幣系統(tǒng)之交易簽名及校驗(yàn)功能
  • Go語(yǔ)言編譯程序從后臺(tái)運(yùn)行,不出現(xiàn)dos窗口的操作

標(biāo)簽:吐魯番 銅川 重慶 雞西 梅河口 欽州 蘭州 汕頭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼》,本文關(guān)鍵詞  語(yǔ)言,操作,數(shù)據(jù)庫(kù),及其,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Go語(yǔ)言操作數(shù)據(jù)庫(kù)及其常規(guī)操作的示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲欧美韩国综合色| 日韩综合第一页| 久久艳妇乳肉豪妇荡乳av| 青青在线观看视频中文字| 亚洲成人av网址| 国产精品99久久久精品无码| 亚洲第一网站男人都懂| av中文在线播放| 麻豆精品视频在线观看视频| 四虎884aa成人精品最新| 国产91热爆ts人妖在线| 综合网五月天| 九九热视频免费在线观看| 欧美精品中文字幕一区二区| 精品麻豆国产| 午夜亚洲精品| 超碰成人在线免费观看| va婷婷在线免费观看| 亚洲精品国产偷自在线观看| 天天插天天干| 欧美精品1区| 国产精品91av| 色窝窝无码一区二区三区| 无码av天堂一区二区三区| 亚洲社区在线观看| 一区一区视频| 国产色综合视频| www.狠狠色.com| 欧美午夜三级| 欧美1区2区| 91亚洲一区| 日韩中文字幕免费在线观看| 欧美一区二区三区爽爽爽| 欧美特级限制片免费在线观看| 日韩一级片在线播放| 亚洲一区二区三区四区在线播放| 日韩风俗一区 二区| 91精品婷婷国产综合久久| 五月天精品在线| 亚洲精品自拍网| 伊人精品综合| 日本韩国在线观看| 国产av一区二区三区精品| 国产美女玉足交| 久久精品国产亚洲aⅴ| 亚洲综合激情五月| 国产在线视频资源| 国产精品色网| 欧美久久久久久久久久久| 91麻豆精品国产91久久久平台| 国内精品卡一卡二卡三| av电影网站在线观看| 中国女人内谢69xxxx免费视频| 亚洲一区二区三区四区av| wwwxxx亚洲| 首页国产欧美久久| 精品久久久久久久久久久久久久久| 久久久不卡网国产精品二区| 亚洲AV无码一区二区三区性| 91麻豆精品国产91久久久久| 日本调教视频在线观看| 久久中文免费视频| 一区视频免费观看| 丁香久久五月| 韩日精品在线| 91手机在线观看| 涩爱av在线播放一区二区| 精品久久久久久最新网址| 99热在线免费播放| 精品动漫一区二区三区| 日韩欧美三级电影| 久久综合色之久久综合| 国产乱码精品一区二区亚洲| 亚洲91av| 国产精品毛片一区二区在线看舒淇| 国产欧美在线观看一区| 欧美性做爰毛片| 在线成人av影院| 一级毛片在线视频| 日韩精品欧美| 超碰97人人射妻| 欧美日韩大片一区二区三区| 九九九九九九精品任你躁| 美女网站色精品尤物极品姐弟| 国产一区二区视频在线观看免费| 亚洲精品美女久久久| 国产真实老熟女无套内射| 亚洲一区二区三区黄色| 麻豆成人在线| 亚洲h在线观看| 国产精品黄色在线观看| 亚洲黄色网址大全| 国产精品动漫网站| 先锋av资源网| 精品国内产的精品视频在线观看| av黄色在线播放| 国产伦一区二区三区色一情| 亚洲人与黑人屁股眼交| 欧美综合激情网| 粗大黑人巨茎大战欧美成人| 日韩电影中文字幕在线观看| av资源在线免费观看| 亚洲视频欧美视频| 一区二区在线中文字幕电影视频| 在线精品亚洲一区二区不卡| 亚洲欧美在线精品| 久久久久久久久久久久国产| 日韩黄色网址| 中文精品在线观看| 亚洲a一区二区三区| 三上悠亚激情av一区二区三区| 蜜桃视频中文字幕| 免费在线播放第一区高清av| 99色在线观看| 亚洲AV无码一区二区三区性| 99视频在线免费播放| 99国产精品国产精品久久| 78色国产精品| 精品久久久久久久中文字幕| 中文字幕人妻无码系列第三区| 欧美性xxxxx极品视频| 在线观看91av| 91黄色小视频| 国产无套精品一区二区| 久操免费在线视频| 在线成人av观看| 一区二区欧美精品| 中文字幕日韩一区二区三区不卡| 成本人h片动漫网站在线观看| 韩国av一区二区| 日本一二三区在线观看| 青青在线免费观看| 精品久久久久久久人人人人传媒| 日本大香伊一区二区三区| xxxxxx欧美| 激情欧美日韩| 五月天婷亚洲天综合网精品偷| 亚洲高清视频免费观看| 91欧美极品| 美女羞羞视频在线观看| 极品尤物久久久av免费看| 国产精品久久久久久久av大片| 成人午夜剧场免费观看完整版| 欧美乱妇一区二区三区不卡视频| 天天综合网站| 日本高清精品| 日韩av高清在线播放| 亚洲国内高清视频| 欧美极品中文字幕| 欧美中文在线字幕| 超碰网在线观看| 精品视频一二区| chinesegaysextube| 一区二区国产视频| 久久久精品视频在线观看| 欧美性xxxxxx少妇| 国产精品免费区二区三区观看| 91天堂在线视频| 亚洲精品美女久久| 日韩免费电影一区二区| 久久久久久久久久久久国产精品| 久久久久欧美精品| 美女国产精品| 亚洲新中文字幕| 欧美日韩电影免费看| 四虎wwwcom| 深夜日韩欧美| 日本一二三区在线视频| 在线观看入口黄最新永久免费国产| 中文字幕在线不卡视频| 无码无遮挡又大又爽又黄的视频| 久久视频这里有精品| 美女又爽又黄免费视频| 亚洲男人影院| 亚洲一区二区四区| 一区二区三区中文字幕| 欧美高清视频看片在线观看| 亚洲精品成人无限看| 极品人妻一区二区三区| ...中文天堂在线一区| 免费电影日韩网站| 岳张嘴把我的精子吞下去| 日本韩国在线观看| 久久99热精品这里久久精品| 日韩一区二区a片免费观看| 国内精品视频在线播放| 一级毛片久久久| 黄色一级a毛片| 亚洲国产精品久久人人爱| 97中文字幕| 久久人人97超碰人人澡爱香蕉| 四季av一区二区凹凸精品| 久久偷拍免费视频| 欧美亚洲黄色| 国产又大又粗又长| 国产麻花豆剧传媒精品mv在线| 成年人视频在线网站| 亚洲精品自在久久| 国产日韩欧美第一页| 午夜精品在线| 欧美激情亚洲天堂| 日韩一级片在线观看| 天天射夜夜骑| 国产精品成人国产乱| 国产欧美精品一区二区色综合朱莉| 久久久久久久久久影院| 国产亚洲精品拍拍拍拍拍| 欧美日韩精品二区| 99热这里只有精| 一本一本久久a久久精品综合妖精| 在线免费观看av网址| 国产精品18久久久久网站| 日韩中文字幕在线免费| 精品女同一区二区| 国产精品一区二区三区四区在线观看| 欧美卡一卡二| 国产精品一级二级| 色欧美乱欧美15图片| 免费av网站在线| 久久午夜电影网| 林心如三级全黄裸体| 四虎国产精品成人免费影视| 国产一区二区三区久久久久久久久| 欧美 日韩 国产 在线| 无码精品国产一区二区三区免费| 久久久噜噜噜久久久| 欧美精品国产精品日韩精品| 国产三级精品在线不卡| 在线日韩av| 国产9色视频| 久久久久久久久久久久久久| 宅男噜噜噜66一区二区| 9久久婷婷国产综合精品性色| 国产午夜手机精彩视频| 亚洲图片激情小说| eeuss影院第1页在线| 欧美福利电影网| 亚洲第一色网站| 免费日韩在线视频| 偷拍与自拍一区| 亚洲永久激情精品| 亚洲视频精品一区| 日本欧美国产| 相泽南亚洲一区二区在线播放| 国产午夜精品福利视频| 欧美激情一区二区三区在线| 国产成人av一区二区三区| 在线视频中文字幕| 国产精品白丝jk白祙| 日韩欧美一区二区久久婷婷| 久久国产麻豆精品| 欧美日韩在线第一页| 亚洲va欧美va天堂v国产综合| 日本老太婆做爰视频| 四虎影院中文字幕| 久久久久久99| 日韩中文字幕三区| 久久精品国产成人一区二区三区| 奇米影视亚洲色图| 乱老熟女一区二区三区| 黄色亚洲大片免费在线观看| 黄色一区二区在线观看| 久久成人免费| 精品五月天堂| 182午夜在线观看| 在线观看亚洲网站| 亚洲黄色小说在线观看| av电影在线观看网站| 57pao国产成永久免费视频| 国产性生活毛片| 日韩电影天堂视频一区二区| 精品人妻中文无码av在线| 国精产品一区一区| 亚洲最大的成人网| 天堂√最新版中文在线| 国产精品欧美激情在线播放| 国产区二精品视| 三年中国中文在线观看免费播放| 欧美成人禁片在线观看网址| 日韩精品久久久久久福利| 国产偷人妻精品一区二区在线| 影视一区二区三区| 亚洲成人精品在线观看| 女教师淫辱の教室蜜臀av软件| 校园春色影音先锋| 欧美电影院免费观看| 亚洲国产精品成人久久综合一区| 人人干在线观看| 亚洲欧美日韩直播| 精品一区二区三区中文字幕老牛| 中文字幕观看在线| 国产精品毛片久久久久久| 国产午夜精品在线| 制服丝袜日韩| 日韩美女一区二区三区四区| 欧美日韩亚洲视频一区| 亚洲小少妇裸体bbw| 国产精品免费久久久久| 欧美这里只有精品| 亚洲麻豆国产自偷在线| 欧美日韩第一视频| 电影一区二区| 亚洲一区美女| 欧美视频在线视频| 久在线观看视频| 丝袜美腿中文字幕| 一卡二卡三卡在线观看| 中文字幕免费高清网站| 亚洲成年电人电影网站| av高清在线免费观看| 影音先锋2020色资源网| 中文字幕不卡在线视频极品| 怡红院怡春院首页| 久久久久久久久国产| 日韩亚洲国产中文字幕欧美| 日韩在线一区二区三区四区| 国产精品视频一区二区久久| 99精品热视频只有精品10| 久久久精品在线| 波多野结衣一区二区三区免费视频| 涩涩视频在线免费看| 亚洲欧洲黄色网| 9色porny自拍视频一区二区| 欧美xxx.com| 一本久道高清无码视频| 国产a级片视频| 国语对白做受69按摩| 精品全国在线一区二区|