本期分享:
1.Go语言进行sha256加密
2.JSON解析时int溢出问题
3.time.After的内存泄漏
正文:
在 Go 中 sha256.Sum256()
返回的是一个 固定长度的数组 [32]byte
,如果我们需要把它转成 字节切片([]byte
) 或 字符串(十六进制格式),就需要额外处理一下。
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
)
func main() {
data := "hello, go!"
// 1. 计算 SHA256 哈希,结果是 [32]byte
hash := sha256.Sum256([]byte(data))
// 2. 转成字节切片([]byte)
// [:] 语法是把数组转成切片
hashBytes := hash[:]
// 3. 转成十六进制字符串
hashString := hex.EncodeToString(hash[:])
// 4. 直接格式化输出(%x)
hashFmt := fmt.Sprintf("%x", hash)
fmt.Println("原始数据:", data)
fmt.Println("SHA256 数组:", hash) // [32]byte
fmt.Println("SHA256 字节切片:", hashBytes) // []byte
fmt.Println("SHA256 十六进制字符串:", hashString)
fmt.Println("SHA256 使用 fmt.Sprintf 输出:", hashFmt)
}
原始数据: hello, go!
SHA256 数组: [34 167 12 39 66 159 119 162 66 9 202 77 191 60 213 190 18 105 103 167 171 59 58 39 37 153 208 196 70 29 244 158]
SHA256 字节切片: [34 167 12 39 66 159 119 162 66 9 202 77 191 60 213 190 18 105 103 167 171 59 58 39 37 153 208 196 70 29 244 158]
SHA256 十六进制字符串: 22a70c27429f77a24209ca4dbf3cd5be126967a7ab3b3a272599d0c4461df49e
SHA256 使用 fmt.Sprintf 输出: 22a70c27429f77a24209ca4dbf3cd5be126967a7ab3b3a272599d0c4461df49e
sha256.Sum256
返回一个 [32]byte
数组(固定长度 32 字节)。string
类型,可以转成 hex
字符串。Go 的 encoding/json
默认会把数字解析成 float64
类型,可能导致大整数丢失精度。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var m map[string]interface{}
data := []byte(`{"id": 9223372036854775807}`)
_ = json.Unmarshal(data, &m)
fmt.Println(m["id"]) // 输出 9.223372036854776e+18 (float64),精度丢失
}
1.使用结构体绑定字段类型
type User struct {
ID int64 `json:"id"`
}
2.使用 json.Decoder.UseNumber()
保持精度
dec := json.NewDecoder(strings.NewReader(`{"id":9223372036854775807}`))
dec.UseNumber()
var m map[string]interface{}
_ = dec.Decode(&m)
id, _ := m["id"].(json.Number).Int64()
fmt.Println(id) // 正确输出 9223372036854775807
time.After
会创建一个新的定时器,即使没人消费也不会回收,可能导致内存泄漏。
for {
select {
case <-time.After(time.Second * 10):
fmt.Println("timeout")
}
}
⚠️ 如果循环频繁执行,每次都会生成新的定时器对象,GC 无法及时回收。
time.NewTimer
并手动停止for {
timer := time.NewTimer(time.Second * 10)
select {
case <-timer.C:
fmt.Println("timeout")
}
timer.Stop() // 手动释放
}
本篇结束?
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。