Go 用JSON加载表格数据
支持热重载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加载表格数据的更多相关文章
- 关于使用easyui为前端框架,加载表格数据较多时在火狐浏览器会出现表格片段不停闪烁问题的兼容问题解决。
1.项目是可视化管理系统,加载的数据较多,使用谷歌浏览器从登陆界面跳转到主页时还算干净利落,但是使用火狐浏览器时在这一过程中在数据没有加载完毕之前,整个页面就仿佛是在闪烁,可以看到闪烁的是表格字段的片 ...
- Android之ListView&Json加载网络数据
使用到的主要内容: 1.Json 解析网络数据 2.异步任务加载图片和数据 3.ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder) 4.ListView ...
- ajax加载表格数据
一.html代码 <style type="text/css"> .table-taskinfo table tr { border-top: 2px solid #9 ...
- JavaScript之加载表格、表单行数据[插件]
/*** * name:加载表格或表单数据[通用] * name:load-table-or-form-data-common.js * * author:zengtai * date:2017-07 ...
- Learning Spark中文版--第五章--加载保存数据(2)
SequenceFiles(序列文件) SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...
- geotrellis使用(二十三)动态加载时间序列数据
目录 前言 实现方法 总结 一.前言 今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...
- 基于zepto的H5/移动端tab切换触摸拖动加载更多数据
以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...
- jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...
- Tree:加载列表数据
Tree控件,需要提供一个树形的JSON数据,才能正常显示. 通常,开发者在后台可以这样做: 1)从数据库查询出一个列表数据 2)在后台,将列表数据转换为树形数据 3)通过JSON方式返回 在前台页面 ...
随机推荐
- web 和 java 资源
1.自己按照上面的网址和密码自己去下载都那些视频都是vip的视频现在下载免费 7-17JAVA开发搜索引擎自动提示[优效学院向天] 链接:http://pan.baidu.com/s/1bpEkfR ...
- RMQ(Range MinimumQuery)问题之ST算法
ST算法------是用来求解给定区间RMQ的最值,本文以最小值为例 ST算法分为两部分 离线预处理(nlogn):运用DP思想,用于求解区间最值,并保存到一个二维数组中. 在线查询 (O(1)):对 ...
- 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96“
在做采集时,有些网页因服务器限制用webclient或者webrequest不能获取html,这时我们可以用webbrowser的方法来绕过对方服务器的限制,但是在实例化webbrowser 的时候发 ...
- idea+maven+springboot+mybatis
确认maven环境,安装maven在这里就不赘述了. 在idea新建maven项目 下图中填上你Maven安装的目录 打开pom文件,导入jar包(手动敲入/拷贝) 下面是配置之后的pom文件内容 & ...
- 做了一个动态代理IP池项目,邀请大家免费测试~
现在出来创业了,目前公司在深圳. 做了啥呢, 做了一个动态代理 IP 池项目 现在邀请大家免费测试体验! 免费激活码:关注微信公众号:2808proxy (每人每天限领一次噢~) 网站:https:/ ...
- 20、MySQLdb
MySQLdb win64位安装python-mysqldb1.2.5 ubuntu下安装MySQLdb sudo apt-get install python-MySQLdb 导入MySQLdb库 ...
- .NET/C# 资源
.NET/C# 开源资源收集 Roslyn ---C# 开源编译器 iSpy免费的开源视频监控平台 https://github.com/ispysoftware/iSpy .NET Fram ...
- IntelliJ IDEA给Serializable类加上自动的serialVersionUID
如题 见下图 设置以后,点击类,按Alt + Enter 自动加入的代码如下图
- JAVA项目中引用Logback的方法
一.简介 本文主要讲JAVA项目中引入Logback的方法. 二.解决 1.引入依赖. <!--Begin LogBack Log--> <!-- https://mvnreposi ...
- R语言︱处理缺失数据&&异常值检验、离群点分析、异常值处理
在数据挖掘的过程中,数据预处理占到了整个过程的60% 脏数据:指一般不符合要求,以及不能直接进行相应分析的数据 脏数据包括:缺失值.异常值.不一致的值.重复数据及含有特殊符号(如#.¥.*)的数据 数 ...