menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 19.7.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    19.7.md
    1.56 KB / 2024-07-16 23:14:29
        # 版本 4 - 用 JSON 持久化存储
    
    第 4 个版本的代码 *goto_v4* 见 [goto_v4](examples/chapter_19/goto_v4)。
    
    # 19.7 以 json 格式存储
    
    如果你是个敏锐的测试者也许已经注意到了,当 goto 程序启动 2 次,第 2 次启动后能读取短 URL 且完美地工作。然而从第 3 次开始,会得到错误:
    
    	Error loading URLStore: extra data in buffer
    
    这是由于 gob 是基于流的协议,它不支持重新开始。为补救该问题,这里我们使用 json 作为存储协议(见 [12.9 节](12.9.md)),它以纯文本形式存储数据,因此也可以被非 Go 语言编写的进程读取。同时也显示了更换一种不同的持久化协议是多么简单,因为与存储打交道的代码被清晰地隔离在 2 个方法中,即 `load()` 和 `saveLoop()`。
    
    从创建新的空文件 store.json 开始,更改 main.go 中声明文件名变量的那一行:
    ```go
    var dataFile = flag.String("file", "store.json", "data store file name")
    ```
    
    在 store.go 中导入 `json` 取代 `gob`。然后在 `saveLoop()` 中唯一需要被修改的行:
    ```go
    e := gob.NewEncoder(f)
    ```
    
    更改为:
    ```go
    e := json.NewEncoder(f)
    ```
    
    类似的,在 `load` 方法中:
    ```go
    d := gob.NewDecoder(f)
    ```
    
    修改为:
    ```go
    d := json.NewDecoder(f)
    ```
    
    这就是所有要改动的地方!编译,启动并测试,你会发现之前的错误不会再发生了。
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[用协程优化性能](19.6.md)
    - 下一节:[多服务器处理架构](19.8.md)
    
    
    links
    file_download