支持热重载reload,但会有一些问题,下面注释有写

package table

import (
"runtime/debug"
) //IntArray int类型数组
type IntArray []int //FloatArray Float32类型数组
type FloatArray []float32 //StringArray string类型数组
type StringArray []string type iTable interface {
load() error
reload() error
} var (
tableList []iTable //MFCity 表格
MFCity = &MFCityTable{file: "../data/mfcity.json"} //CityBattleCreature 表格
CityBattleCreature = &CityBattleCreatureTable{file: "../data/cityBattleCreature.json"}
) func init() {
tableList = []iTable{
MFCity,
CityBattleCreature,
}
} //Load 加载所有表格
func Load() {
for _, v := range tableList {
if e := v.load(); nil != e {
panic(e.Error())
}
}
} //Reload 重新加载所有表格
//说明:
//1、Reload的表不会减少条数,比如A表原来有100条,然后给改成99条,Reload完还是100条
//2、Reload不会改变数组长度,只能改变值,[1,2,3]然后表改成[2,2],Reload后实际是[2,2,3]
func Reload() {
//中间处理不可预料得错误一定要恢复回来
defer func() {
if err := recover(); nil != err {
log.Error("[Table.Reload] %s", debug.Stack())
}
}() for _, v := range tableList {
if e := v.reload(); nil != e {
log.Error(e.Error())
}
}
} //DeepCopy 深拷贝
//要传入两个指针,不要传值
func DeepCopy(dst, src interface{}) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}

表格代码

package table

import (
"runtime/debug"
) //MFCityData 单个数据
type MFCityData struct {
ID int `json:"id"`
City int `json:"city"`
Lv IntArray `json:"lv"`
TaskCommon []IntArray `json:"taskCommon"`
} //MFCityTable 表格
type MFCityTable struct {
file string
DataMap map[int]MFCityData
} //load 加载
func (table *MFCityTable) load() error {
if nil == table.DataMap {
table.DataMap = make(map[int]MFCityData)
} temp := make([]MFCityData, )
if err := util.LoadJSONConfig(table.file, &temp); nil != err {
return err
} for _, v := range temp {
table.DataMap[v.ID] = v
} return nil
} //reload 重新表格
//重新加载不会不做减量,只做增量和改变
func (table *MFCityTable) reload() error { //中间处理不可预料得错误一定要恢复回来
defer func() {
if err := recover(); nil != err {
log.Error("[MFCityTable.reload] %s", debug.Stack())
}
}() temp := make([]MFCityData, )
if err := util.LoadJSONConfig(table.file, &temp); nil != err {
return err
} for _, v := range temp {
//已有的要修改值,新增得直接增加
if data, ok := table.DataMap[v.ID]; ok {
DeepCopy(&data, &v)
} else {
table.DataMap[v.ID] = v
}
} return nil
} //GetByID 根据ID查找
func (table *MFCityTable) GetByID(id int) (*MFCityData, bool) {
v, ok := table.DataMap[id]
return &v, ok
}

Go 用JSON加载表格数据的更多相关文章

  1. 关于使用easyui为前端框架,加载表格数据较多时在火狐浏览器会出现表格片段不停闪烁问题的兼容问题解决。

    1.项目是可视化管理系统,加载的数据较多,使用谷歌浏览器从登陆界面跳转到主页时还算干净利落,但是使用火狐浏览器时在这一过程中在数据没有加载完毕之前,整个页面就仿佛是在闪烁,可以看到闪烁的是表格字段的片 ...

  2. Android之ListView&Json加载网络数据

    使用到的主要内容: 1.Json 解析网络数据 2.异步任务加载图片和数据 3.ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder) 4.ListView ...

  3. ajax加载表格数据

    一.html代码 <style type="text/css"> .table-taskinfo table tr { border-top: 2px solid #9 ...

  4. JavaScript之加载表格、表单行数据[插件]

    /*** * name:加载表格或表单数据[通用] * name:load-table-or-form-data-common.js * * author:zengtai * date:2017-07 ...

  5. Learning Spark中文版--第五章--加载保存数据(2)

    SequenceFiles(序列文件)   SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...

  6. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

  7. 基于zepto的H5/移动端tab切换触摸拖动加载更多数据

    以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...

  8. jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据

    jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...

  9. Tree:加载列表数据

    Tree控件,需要提供一个树形的JSON数据,才能正常显示. 通常,开发者在后台可以这样做: 1)从数据库查询出一个列表数据 2)在后台,将列表数据转换为树形数据 3)通过JSON方式返回 在前台页面 ...

随机推荐

  1. js 事件冒泡、捕获;call()、apply()

    他们是描述事件触发时序问题的术语.事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是 ...

  2. python之item方法

    __setitem__   __getitem__  __delitem__这三个函数 是通过字典形式来处理属性 字典形式使用中括号的方式获取值 class Foo: def __init__(sel ...

  3. flask 跨域问题

    在Flask开发RESTful后端时,前端请求会遇到跨域的问题.下面是解决方法.Python版本:3.5.1 下载flask_cors包 pip install flask-cors使用flask_c ...

  4. pygame 笔记-1 按键控制方块移动

    背景:家里的娃慢慢长大了,准备教一些儿童入门的编程知识,研究了一阵麻省理工的scratch 2 虽然不错,但是功能有限,很多高级点的东西玩不出来.所以就有了这一系列,先提前自学一下,顺便拿来练手pyt ...

  5. Python多进程池 multiprocessing Pool

    1. 背景 由于需要写python程序, 定时.大量发送htttp请求,并对结果进行处理. 参考其他代码有进程池,记录一下. 2. 多进程 vs 多线程 c++程序中,单个模块通常是单进程,会启动几十 ...

  6. C# 程序打包成安装项目

    Xaml设置图标https://blog.csdn.net/u014234260/article/details/73648649 winform程序控制面板中卸载显示图标https://blog.c ...

  7. Java WebSocket实现网络聊天室(群聊+私聊)

    1.简单说明 在网上看到一份比较nice的基于webSocket网页聊天项目,准备看看学习学习,如是有了这篇文章!原博主博客:http://blog.csdn.net/Amayadream/artic ...

  8. LeetCode: Gray Code [089]

    [题目] The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...

  9. 基于java实现的简单区块链

    技术:maven3.0.5 + jdk1.8   概述 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的 ...

  10. 获取当前网页的绝对URL地址

    通过创建一个虚拟的<a></a>元素,将它的href指定为相对URL,再读取它的href就会得到绝对URL. var getAbsoluteUrl = (function() ...