package data import ( "fmt" "os" "reflect" "strings" ) type tableLoader interface { load(buf []byte) error } type Tables struct { Copy CopyTable CopyMain CopyMainTable Equip EquipTable EquipLevel EquipLevelTable EquipRefine EquipRefineTable EquipSet EquipSetTable Hero HeroTable HeroBond HeroBondTable HeroBook HeroBookTable HeroBreak HeroBreakTable HeroLevel HeroLevelTable HeroSoul HeroSoulTable FunctionOpen FunctionOpenTable Item ItemTable Monster MonsterTable Scene SceneTable ServerConfig ServerConfigTable Treasure TreasureTable TreasureLevel TreasureLevelTable TreasureRefine TreasureRefineTable UpgradeMaster UpgradeMasterTable } func NewTables(dataDir string) (*Tables, error) { var tables = new(Tables) var tt = reflect.TypeOf(tables).Elem() var tv = reflect.ValueOf(tables).Elem() var fn = tt.NumField() for i := range fn { var sf = tt.Field(i) var ft = sf.Type var name = ft.Name() if strings.HasSuffix(name, "Table") { name = strings.TrimSuffix(name, "Table") } var fv = tv.Field(i) loader, ok := fv.Addr().Interface().(tableLoader) if !ok { continue } buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", dataDir, strings.ToLower(name))) if err != nil { return nil, err } err = loader.load(buf) if err != nil { return nil, err } } return tables, nil }