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方式返回 在前台页面 ...
随机推荐
- linux 系统下使用socket进行本地进程间通信
转自:https://blog.csdn.net/baidu_24553027/article/details/54912724 使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不 ...
- Java的内存管理机制之内存区域划分
各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...
- 【性能提升神器】STRAIGHT_JOIN
今天给大家下另一个性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOI ...
- SharePoint每日小贴士Web部件
SharePoint每日小贴士Web部件 项目描写叙述 此Web部件从指定SP自己定义列表或一个选定的 RSS源选择一个随机项目.并显示一张图片.标题和一个Tip. 适 ...
- 使用CGlib实现Bean拷贝(BeanCopier)
在做业务的时候,我们有时为了隔离变化,会将DAO查询出来的Entity,和对外提供的DTO隔离开来.大概90%的时候,它们的结构都是类似的,但是我们很不喜欢写很多冗长的b.setF1(a.getF1( ...
- 使用scp命令在多个Linux系统间进行文件复制
一,什么是scp scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令.scp命令可以在linux服务器之间复制文件和目录.scp使用ssh安全协议传输数据,具有和ssh一样的验证机制,从 ...
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...
- .Net混淆工具和反混淆工具
一.简介 本文给大家列举一些常用的.net程序反破解代码混淆工具.同时也列取一些反混淆工具. 二.混淆工具 Agile.NET (aka CliSecure) Babel.NET CodeFort C ...
- 每天一个linux命令(8):rm
1.命令简介 rm(Remove file 删除目录或文件)删除文件,对于链接文件,只是删除整个链接文件,而原有文件保持不变. 2.用法 rm [选项]... 文件.. 3.选项 -f, –force ...
- 使用插件扩展Docker
http://wwwbuild.net/dockerone/241249.html Docker吸引我的,同时也是促使其成功的一个重要方面,是其开箱即用的特性. “开箱即用”是指什么呢?简单来说, ...