go開發筆記2018-12-03

自定義結構體排序

簡單的來講,實現sort中三個方法便可,就是這三個。ui

func (p IntSlice) Len() int           { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
複製代碼

舉個例子,一個文件類,根據是否爲文件夾來排序,或者其餘的。spa

func main() {
    var files []File
    for i := 0; i < 5; i++ {
        dir := false
        if i % 2 == 0 {dir = true}
        file := File{
            Name: "a"+i,
            IsDir: dir, 
        }
    }
    sort.Sort(Files(files))
    fmt.Println(files)
}

type File struct {
    Name  string
    IsDir bool   // 是否爲文件夾
}

type Files []File

func (f Files) Len() int {
    return len(f)
}

func (f Files) Swap(i, j int) {
    f[i], f[j] = f[j], f[i]
}

func (f Files) Less(i, j int) bool {
    if f[i].IsDir { i = 0 } else { i = 1}
    if f[j].IsDir { j = 0 } else { j = 1}
    return i < j
}

複製代碼

獲取文件夾目錄

dir, err := ioutil.ReadDir(dirPath)
if err != nil {
	return	
}
for _, v := range dir {
    // v.Name() 文件名稱
    // v.Size() 文件大小
    // v.IsDir() 是否文件夾
    // v.ModTime() 文件修改時間
    // v.Sys() 文件系統系統
}
複製代碼

unix字符串轉時間

func unixToString(unix int64) (str string) {
	tu := time.Unix(unix, 0)
	return tu.Format("2006-01-02 15:04:05")
}
複製代碼

文件大小轉對應的mb

func sizeFormat(size int64) (sizeStr string) {
	if size < 1024 {
		return fmt.Sprintf("%d%s", size, "B")
	} else {
		size = size / 1024
	}
	if size < 1024 {
		return fmt.Sprintf("%d%s", size, "KB")
	} else {
		size = size / 1024
	}
	if size < 1024 {
		size = size * 100
		sizeStr = fmt.Sprintf("%v%v%s", size/100, size%100, "MB")
	} else {
		size = size * 100 / 1024
		sizeStr = fmt.Sprintf("%v%v%s", size/100, size%100, "GB")
	}
	return
}
複製代碼

判斷文件是否存在

func IsExist(path string) bool {
	_, err := os.Stat(path)
	if err == nil {
		return true
	}

	if os.IsNotExist(err) {
		return false
	}
	return false
}
複製代碼

gin中間件token驗證

// 哪一步不須要存在就將中間件放在哪一步後面使用
func InitRouter(g *gin.Engine) {
	g.GET("/register", Register)
	g.Use(jwt.JWTAuth())
	// 這裏開始就會進行token驗證
	g.GET("/login", Login)
}

func JWTAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Request.Header.Get("token")
		if token == "" {
			c.JSON(http.StatusOK, gin.H{
				"message": "請求未攜帶token,無權限訪問",
				"state":   -1,
			})
			c.Abort()
			return
		}
		j := NewJWT()
		claims, err := j.ParseToken(token)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"message": "token驗證失敗,無權限訪問",
				"state":   -1,
			})
			c.Abort()
			return
		}
		c.Set("claims", claims)
	}
}

type JWT struct {
	JWTKey []byte
}

func GetJWT() string {
	return viper.GetString("jwtkey")
}

func NewJWT() *JWT {
	return &JWT{
		JWTKey: []byte(GetJWT()),
	}
}

func (j *JWT) CreateToken() (string, error) {
	claims := jwt.StandardClaims{
		NotBefore: time.Now().Unix(),
		Issuer:    string(j.JWTKey),
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(j.JWTKey)
}

func (j *JWT) ParseToken(tokenStr string) (*jwt.StandardClaims, error) {
	token, err := jwt.ParseWithClaims(tokenStr, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
		return j.JWTKey, nil
	})
	if err != nil {
		return nil, err
	}
	if claims, ok := token.Claims.(*jwt.StandardClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, err
}
複製代碼
相關文章
相關標籤/搜索