簡單的來講,實現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() 文件系統系統
}
複製代碼
func unixToString(unix int64) (str string) {
tu := time.Unix(unix, 0)
return tu.Format("2006-01-02 15:04:05")
}
複製代碼
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
}
複製代碼
// 哪一步不須要存在就將中間件放在哪一步後面使用
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
}
複製代碼