支持热重载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. 分析java内存情况

    使用pmap查看进程内存 运行命令 使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况, 命令格式: pmap 进程id 示例说明 例如运行: pmap 12358 显示结果如下图 ...

  2. js权威指南笔记

    //如setTimeout的delay参数为0毫秒,那么指定的函数不会立即执行.只会把它放到队列中,等到前面处于等待状态的事件处理 //程序全部执行完成后,再调用它. function invoke( ...

  3. python 生成动态密码

    import stringimport randomdef gen_psd(length=10): """length is password length"& ...

  4. Servlet(3)—Servlet

    基本知识: java Servlet是和平台无关的服务端组件,它运行在Servlet容器中,Servlet容器负责Servlet和客户的通信以及调用Servlet方法,Servlet和客户的通信采用& ...

  5. django之setting配置汇总

    前面的随笔中我们经常会改setting配置也经常将一些配置混淆今天主要是将一些常见的配置做一个汇总. setting配置汇总 1.app路径 INSTALLED_APPS = [ 'django.co ...

  6. mysql 函数应用

    mod 取余是用函数mod(numer1,number2),其返回的值为其余数值 如:mod(id,2) = 1 返回id号是奇数的id Email后缀提取 emailorg=RIGHT(EMail, ...

  7. python3 图片文字识别

    最近用到了图片文字识别这个功能,从网上搜查了一下,决定利用百度的文字识别接口.通过测试发现文字识别率还可以.下面就测试过程简要说明一下 1.注册用户 链接:https://login.bce.baid ...

  8. 【问题与解决】Mac OS通过 npm 安装 React Native 报错(checkPermissions Missing write access to /usr/local/lib/node_modules)

    报错情况: 当Mac OS通过 npm 安装 React Native 报错,警告文字为:checkPermissions Missing write access to /usr/local/lib ...

  9. python接口自动化测试(四)-Cookie&Sessinon

    掌握了前面几节的的内容,就可以做一些简单的http协议接口的请求发送了,但是这些还不够.HTTP协议是一个无状态的应用层协议,也就是说前后两次请求是没有任何关系的,那如果我们测试的接口之前有相互依赖关 ...

  10. CodeForces - 344E Read Time (模拟题 + 二分法)

    E. Read Time time limit per test 1 second memory limit per test 256 megabytes input standard input o ...