zoukankan      html  css  js  c++  java
  • 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, 0)
        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, 0)
        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
    }
  • 相关阅读:
    Below is a nice utility class for Enums
    ASP.NET页面与IIS底层交互和工作原理详解
    深入理解 __doPostBack
    DataList控件显示图片要的是效果
    Below is a nice utility class for Enums
    ExtensionMethods Class
    showModalDialog中打开新页面Session丢失
    Delegate,Action,Func,匿名方法,匿名委托,事件
    异步编程:IAsyncResult异步编程模型 (APM)
    C#线程系列讲座(1):BeginInvoke和EndInvoke方法
  • 原文地址:https://www.cnblogs.com/mrblue/p/8969195.html
Copyright © 2011-2022 走看看