支持热重载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. spring接入swagger后单元测试报错

    2017-05-16 11:58:05.276 INFO 11268 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing ...

  2. docker中的数据库

      注:自从开始使用docker,部署方面的事情就简单多了.使用docker构建的数据库容器不用直接安装,开启后就可以使用,也比以前方便很多.下面将一些要点记录下来. 下面的例子使用以下环境: - 系 ...

  3. python之使用set对列表去重,并保持列表原来顺序(转)

    https://www.cnblogs.com/laowangball/p/8424432.html #原始方法,但是会打乱顺序 mylist = [1,2,2,2,2,3,3,3,4,4,4,4]m ...

  4. Translate Angular >=4 with ngx-translate and multiple modules

    原文:https://medium.com/@lopesgon/translate-angular-4-with-ngx-translate-and-multiple-modules-7d9f0252 ...

  5. django-关于manage.py migrate无效的问题

    django-关于manage.py migrate无效的问题 2017年03月04日 15:23:36 Jessie-via 阅读数:12317 标签: pythondjango 更多 个人分类:  ...

  6. mysql数据类型转换

    --CAST(xxx AS 类型) --CONVERT(xxx,类型) --#浮点型转化为int --i='3.35' --cast(i as signed) --cast(sum(money/100 ...

  7. Spring Boot用Cxf的jax-ws开发WebService

    首先上项目的pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  8. bootstrap table 的简单Demo

    暂时够用,不够用再补充 T_T script: <link rel="stylesheet" href="lib/bootstrap.min.css"&g ...

  9. Mathematica绘制曲面交线方法

    新引入的SliceContourPlot不错 SliceContourPlot3D[y, (1.7 x^2 + y/3 + 0.6 z^2) (1.7 (x - 2)^2 + y/3 + 0.6 z^ ...

  10. hive set 常用参数汇总

    1. set hive.auto.convert.join = true; mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去 ...