参考: www.cnblogs.com/ricklz/p/10…
- string 转 int或int64
自己取一个名字, _ :=strconv.Atoi(string(要转的内容))
自己取一个名字, _ := strconv.ParseInt(要转的内容, 10, 64)
- string 转 float64
自己取一个名字, _ := strconv.ParseFloat(要转的内容, 64)
- int转string
自己取一个名字, _ := strconv.Itoa(int(要转的内容))
- int64转string
自己取一个名字, _ := strconv.FormatInt(要转的内容,10)
- float64保留两位小数
自己取一个名字, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 要转的内容), 64)
- float 转 string
自己取一个名字 = strconv.FormatFloat(要转的内容, 'g', -1, 64)
- 字符串去空格
要取的名字 := strings.TrimSpace(字符串)
- 时间戳转"2006-01-02"格式
time = utils.FormatDate(要转的时间, "2006-01-02")
FormatDate
func FormatDate(unixTime int64, format string, timeZone ...string) string {
timeObj := time.Unix(unixTime/1000, unixTime%1000)
if len(timeZone) > 0 {
location, err := time.LoadLocation(timeZone[0])
if err == nil {
return fmt.Sprint(timeObj.In(location).Format(format))
}
}
return timeObj.Format(format)
}
- 时间格式“2006-01-02T15:04:05.000Z”转换成“2006-01-02 15:04:05”
timeStr1, _ := utils.StrToTimeInLocation(要转的时间, "2006-01-02T15:04:05.000Z", "Asia/Shanghai")
要转的时间 = utils.FormatDate(timeStr1, "2006-01-02 15:04:05")
StrToTimeInLocation
func StrToTimeInLocation(timeStr string, format string, timeZone string) (int64, error) {
location := time.Local
var err error
if timeZone != "" {
location, err = time.LoadLocation(timeZone)
if err != nil {
location = time.FixedZone("CST-8", 8*3600)
}
}
timeObj, err := time.ParseInLocation(format, timeStr, location)
if err != nil {
return 0, err
} else {
return timeObj.UnixNano() / 1000000, nil
}
}
- 获取当前时间戳
now := time.Now()
// 当天凌晨时间戳
zero := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
zero_tm := zero.Unix() * 1000
- 字节转json
toJson, _ := json.Marshal([]byte值)
beego.Info("-----------------", string(toJson))
- 判断当前操作系统
var ostype = runtime.GOOS //获取当前操作系统
if ostype == "windows" {
beego.Info("【当前操作系统】", ostype) //windows
} else if ostype == "linux" {
beego.Info("【当前操作系统】", ostype) //linux
}
- 获取当前项目的工作目录并判断该文件是否存在
// 路径地址
jektDir, err := os.Getwd() // 获取当前工作目录
if err != nil {
fmt.Println("获取当前工作目录失败:", err)
}
baseFilePath := filepath.Join(jektDir, "logs", "今日总结")
// 检查文件夹是否存在,不存在则创建
fi, err := os.Stat(baseFilePath){
beego.Info("fi....", fi)
if os.IsNotExist(err) {
err = os.MkdirAll(baseFilePath, os.ModePerm)
if err != nil {
fmt.Println("创建文件夹错误:", err)
}
}
- 生成 TOTP 并使用 三方软件(数盾、腾讯身份验证器) 进行查看密码
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
"github.com/pquerna/otp"
"github.com/pquerna/otp/totp"
"github.com/skip2/go-qrcode"
)
func main() {
// 生成 totp
k := GenerateToTp()
// 生成 二维码
GenerateQRCode(k, "demo001")
// 输入验证码
reader := bufio.NewReader(os.Stdin)
fmt.Println("请输入验证码: ")
text, err := reader.ReadString('\n')
if err != nil {
fmt.Println("读取输入时发生错误:", err)
return
}
// 校验 验证码是否正确
VerifyToTp(text, k.Secret())
}
// 生成 totp 密钥
func GenerateToTp() *otp.Key {
key, err := totp.Generate(totp.GenerateOpts{
Issuer: "TEST-SOFT",
AccountName: "TestDemo-V0.0.1",
})
if err != nil {
fmt.Printf("生成 TOTP 密钥失败。: %v", err)
}
fmt.Printf("生成的TOTP密钥URI: %v", key.URL())
return key
}
// 生成 二维码进行绑定
func GenerateQRCode(key *otp.Key, name string) string {
fmt.Printf("GenerateQRCode key.URL() = %v", key.URL())
qrPath := "." + name + ".png"
// 生成并保存二维码
err := qrcode.WriteFile(key.URL(), qrcode.Medium, 256, qrPath)
if err != nil {
fmt.Printf("Failed to generate QR code: %v", err)
}
return ""
}
// 校验 totp 密码是否正确
func VerifyToTp(code, secret string) bool {
fmt.Printf("验证 TOTP CODE: %s", code)
fmt.Printf("验证 TOTP SECRET: %s", secret)
isValid, err := totp.ValidateCustom(strings.TrimSpace(code), strings.TrimSpace(secret), time.Now(), totp.ValidateOpts{
Skew: 1, // 允许前后1个时间窗口的偏差
Digits: 6, // 6位数字
})
if err != nil {
fmt.Printf("验证 TOTP 失败: %v", err)
return false
}
if isValid {
fmt.Print("一次性密码有效!")
return true
} else {
fmt.Print("一次性密码无效!")
return false
}
}