首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《Go小技巧&易错点100例》第四十二篇

《Go小技巧&易错点100例》第四十二篇

原创
作者头像
闫同学
发布2025-09-02 19:58:13
发布2025-09-02 19:58:13
1730
举报

本期分享:

1.Go语言进行sha256加密

2.JSON解析时int溢出问题

3.time.After的内存泄漏


正文:

Go语言进行 sha256 加密

在 Go 中 sha256.Sum256() 返回的是一个 固定长度的数组 [32]byte,如果我们需要把它转成 字节切片([]byte字符串(十六进制格式),就需要额外处理一下。

示例代码:
代码语言:go
复制
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)
}
输出结果示例:
代码语言:shell
复制
原始数据: 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 字符串。
  • 哈希值不可逆,一般用于数据校验、密码存储。

JSON 解析时 int 溢出问题

Go 的 encoding/json 默认会把数字解析成 float64 类型,可能导致大整数丢失精度。

错误示例:
代码语言:go
复制
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.使用结构体绑定字段类型

代码语言:go
复制
type User struct {
    ID int64 `json:"id"`
}

2.使用 json.Decoder.UseNumber() 保持精度

代码语言:go
复制
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 的内存泄漏问题

time.After 会创建一个新的定时器,即使没人消费也不会回收,可能导致内存泄漏。

问题示例:
代码语言:go
复制
for {
    select {
    case <-time.After(time.Second * 10):
        fmt.Println("timeout")
    }
}

⚠️ 如果循环频繁执行,每次都会生成新的定时器对象,GC 无法及时回收。

解决方法:使用 time.NewTimer 并手动停止
代码语言:go
复制
for {
    timer := time.NewTimer(time.Second * 10)
    select {
    case <-timer.C:
        fmt.Println("timeout")
    }
    timer.Stop() // 手动释放
}

本篇结束?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go语言进行 sha256 加密
    • 示例代码:
    • 输出结果示例:
    • 要点说明:
  • JSON 解析时 int 溢出问题
    • 错误示例:
    • 解决方法:
  • time.After 的内存泄漏问题
    • 问题示例:
    • 解决方法:使用 time.NewTimer 并手动停止
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档