### 日志
**logrus**
```go
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func init() {
logrus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
logrus.SetOutput(os.Stdout)
logrus.SetLevel(logrus.InfoLevel)
}
func main() {
logrus.WithFields(logrus.Fields{
"animal": "walrus",
}).Info("A walrus appears")
logrus.Info("hello")
}
```
- 打印效果
```bash
{"animal":"walrus","level":"info","msg":"A walrus appears","time":"2020-11-22 11:34:52"}
{"level":"info","msg":"hello","time":"2020-11-22 11:34:52"}
```
### 定時(shí)任務(wù)
**robfig**
```go
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"log"
"time"
)
func main() {
TimeTask()
}
// TimeTask 定時(shí)任務(wù)
// cron.New() 分鐘級(jí)別定時(shí)任務(wù)
// cron.New(cron.WithSeconds()) 秒級(jí)定時(shí)任務(wù)
func TimeTask() {
c := cron.New(cron.WithSeconds())
// 定時(shí)表
cronTab := "*/3 * * * * ?"
id, err := c.AddFunc(cronTab, task1)
if err != nil {
log.Println(err)
}
//開(kāi)啟任務(wù)
c.Start()
//任務(wù)id
fmt.Println(id)
time.Sleep(time.Minute * 2) //測(cè)試使用
}
// task1 需要執(zhí)行的任務(wù)
func task1() {
now := time.Now().Format("2006-01-02 15:04:05")
fmt.Println("定時(shí)任務(wù)執(zhí)行時(shí)間", "-->", now)
}
```
### 文件上傳
```go
package main
import (
"io"
"io/ioutil"
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)
const (
MAX_UPLOAD_SIZE = 1024 * 1024 * 20 //50MB
)
func main() {
r := RegisterHandlers()
http.ListenAndServe(":8080", r)
}
//RegisterHandlers ...
func RegisterHandlers() *httprouter.Router {
router := httprouter.New()
router.POST("/upload", uploadHandler)
return router
}
func uploadHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE)
if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil {
log.Printf("File is too big")
return
}
file, headers, err := r.FormFile("file")
if err != nil {
log.Printf("Error when try to get file: %v", err)
return
}
//獲取上傳文件的類型
if headers.Header.Get("Content-Type") != "image/png" {
log.Printf("只允許上傳png圖片")
return
}
data, err := ioutil.ReadAll(file)
if err != nil {
log.Printf("Read file error: %v", err)
return
}
fn := headers.Filename
err = ioutil.WriteFile("./video/"+fn, data, 0666)
if err != nil {
log.Printf("Write file error: %v", err)
return
}
w.WriteHeader(http.StatusCreated)
io.WriteString(w, "Uploaded successfully")
}
```
- 首頁(yè)
- 文檔
- 問(wèn)答
- Golang
- 基礎(chǔ)知識(shí)
- 快速入門
- 數(shù)據(jù)庫(kù)
- MySQL
- PostgreSQL
- Elasticsearch
- Web 框架
- Gin
- 高級(jí)技巧
- 排序 & 二分查找
- 子數(shù)據(jù)循環(huán)處理
- 時(shí)間序列化與反序列化
- 百分比 & 保留小數(shù)
- 定時(shí)任務(wù)
- null 值處理
- 日期處理
- URL 解析 & 排序
- 實(shí)用工具
- 第三方工具
- 加密算法
- 安全協(xié)程
- 驗(yàn)證器
- 用戶認(rèn)證
- 微信 SDK
- 支付 SDK
- XORM 反轉(zhuǎn)工具
- 快速調(diào)試
- 文檔制作
- Web 工具
- JSON 工具
- 速查清單
- 擴(kuò)展閱讀
