package data import ( "fmt" "os" "reflect" "strings" ) type tableLoader interface { load(buf []byte) error } type Tables struct { Equip EquipTable EquipLevel EquipLevelTable EquipSet EquipSetTable Hero HeroTable HeroBond HeroBondTable HeroBreak HeroBreakTable HeroLevel HeroLevelTable HeroGeneral HeroGeneralTable Item ItemTable ServerConfig ServerConfigTable } 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 }