go编程技巧(持久化结构体)

105 阅读2分钟
package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "os"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    // 创建一个 Person 结构体实例
    person := Person{Name: "Alice", Age: 30}

    // 序列化 Person 结构体
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    err := enc.Encode(person)
    if err != nil {
        fmt.Println("Error encoding:", err)
        return
    }

    // 将序列化后的数据写入文件
    err = os.WriteFile("data/person.gob", buf.Bytes(), 0644)
    if err != nil {
        fmt.Println("Error writing to file:", err)
        return
    }

    // 从文件中读取序列化后的数据
    data, err := os.ReadFile("data/person.gob")
    if err != nil {
        fmt.Println("Error reading from file:", err)
        return
    }

    // 反序列化数据为 Person 结构体
    var decodedPerson Person
    dec := gob.NewDecoder(bytes.NewReader(data))
    err = dec.Decode(&decodedPerson)
    if err != nil {
        fmt.Println("Error decoding:", err)
        return
    }

    // 输出反序列化后的 Person 结构体
    fmt.Printf("Decoded person: %+v\n", decodedPerson)

    // 删除文件
    err = os.Remove("data/person.gob")
    if err != nil {
        fmt.Println("Error removing file:", err)
    }
}

使用标准库中的encoding/gob库完成对结构体的持久化

举个例子:

用户上传了了一份数据后,通过各种复杂的逻辑计算生成了一份有大量内容的结构化报告数据,用户查看这份报告时需要把整个数据返回给前端来进行可视化渲染图表、表格形式。这些结构化数据存储到数据库如果内容太长会导致整个表查询速度变慢。数据库直接存储持久化后的结构体地址(适用于客户端应用,不适用于无状态应用),采用这种形式也可以减少网络带来的消耗。

原因

  1. 存储和I/O瓶颈:

    • LONGTEXT 字段会占用大量的存储空间,导致表的整体大小增加。
    • 大表会增加磁盘I/O操作的频率,尤其是在全表扫描或大量行需要读取的情况下。
  2. 数据处理和网络传输:

    • 大量数据需要传输到客户端,增加了网络负载和延迟。

附录

MySql中LongText类型大字段查询优化 - 简书 (jianshu.com)