go遇到的问题(持续更新)

275 阅读3分钟

参考: 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
	}

}