package hero_test import ( "context" "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego" "go_dreamfactory/lego/base/rpcx" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/cron" "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules/equipment" "go_dreamfactory/modules/hero" "go_dreamfactory/modules/items" "go_dreamfactory/modules/task" "go_dreamfactory/modules/user" "go_dreamfactory/pb" "go_dreamfactory/services" "go_dreamfactory/sys/configure" "go_dreamfactory/sys/db" "go_dreamfactory/utils" "os" "reflect" "runtime/trace" "strings" "testing" "time" "github.com/golang/protobuf/ptypes" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" flag "github.com/spf13/pflag" ) var service core.IService var s_gateComp comm.ISC_GateRouteComp = services.NewGateRouteComp() var module = new(hero.Hero) type TestService struct { rpcx.RPCXService } func newService(ops ...rpcx.Option) core.IService { s := new(TestService) s.Configure(ops...) return s } //初始化相关系统 func (this *TestService) InitSys() { this.RPCXService.InitSys() if err := db.OnInit(this.GetSettings().Sys["db"]); err != nil { panic(fmt.Sprintf("init sys.db err: %s", err.Error())) } else { log.Infof("init sys.db success!") } if err := configure.OnInit(this.GetSettings().Sys["configure"], configure.SetConfigPath("F:/work/go/go_dreamfactory/bin/json")); err != nil { panic(fmt.Sprintf("init sys.configure err: %s", err.Error())) } else { log.Infof("init sys.configure success!") } } func GetMonthStartEnd() (int64, int64) { t := configure.Now() monthStartDay := t.AddDate(0, 0, -t.Day()+1) monthStartTime := time.Date(monthStartDay.Year(), monthStartDay.Month(), monthStartDay.Day(), 0, 0, 0, 0, t.Location()) monthEndDay := monthStartTime.AddDate(0, 1, -1) monthEndTime := time.Date(monthEndDay.Year(), monthEndDay.Month(), monthEndDay.Day(), 23, 59, 59, 0, t.Location()) _d1 := monthStartTime.Unix() _d2 := monthEndTime.Unix() fmt.Printf("%d,%d", _d1, _d2) return _d1, _d2 } func TimerStar() { //star := configure.Now() if !db.IsCross() { conn, err := db.Cross() if err == nil { model := db.NewDBModel(comm.TablePagodaRecord, 0, conn) //model.DB.DeleteMany(comm.TableSeasonPagoda, bson.M{}, options.Delete()) model.DB.DeleteMany(comm.TablePagodaRecord, bson.M{}, options.Delete()) for pos := 0; pos < comm.MaxRankNum; pos++ { key1 := fmt.Sprintf("pagodaList%d", pos) if err := model.Redis.Delete(key1); err != nil { log.Errorf("delete failed") } } if err := model.Redis.Delete("pagodaSeasonRank"); err != nil { log.Errorf("delete failed") } } // DB.DeleteMany(comm.TableSeasonRecord, bson.M{}, options.Delete()) } //this.module.Debugf("=====%d,", time.Since(star).Milliseconds()) } // 定义结构体 type sumy struct { a int b string // 嵌入字段 float32 bool next *sumy } func Test_Main(t *testing.T) { ids := utils.RandomNumbers(0, 10, 5) for _, v := range ids { fmt.Printf("%d", v) } c := map[int32]int32{ 3: 100, 6: 250, 9: 100, } out := make(map[int32]int32) last := 1 for iPos, v := range c { for ; int32(last) <= iPos; last++ { out[int32(last)] = v } } // 值包装结构体 d := reflect.ValueOf(sumy{ next: &sumy{}, }) // 获取字段数量 fmt.Println("NumField", d.NumField()) // 获取索引为2的字段(float32字段) floatField := d.Field(2) // 输出字段类型 fmt.Println("Field", floatField.Type()) // 根据名字查找字段 fmt.Println("FieldByName(\"b\").Type", d.FieldByName("b").Type()) // 根据索引查找值中, next字段的int字段的值 fmt.Println("FieldByIndex([]int{4, 0}).Type()", d.FieldByIndex([]int{4, 0}).Type()) var a int = 1024 // 获取变量a的反射值对象 valueOfA := reflect.ValueOf(a) fmt.Println(reflect.TypeOf(a), a) typeofA := reflect.TypeOf(a).Elem().Kind() // 获取interface{}类型的值, 通过类型断言转换 var getA int = valueOfA.Interface().(int) // 获取64位的值, 强制类型转换为int类型 var getA2 int = int(valueOfA.Int()) fmt.Println(getA, getA2, typeofA) cron.AddFunc("0 0 5 /* * ?", TimerStar) //每月第一天5点执行一次 sz := make([]string, 0) for i := 0; i < 10; i++ { sz = append(sz, "1") } sz[len(sz)-1] = "xxxx" //创建trace文件 f, err := os.Create("trace.out") if err != nil { panic(err) } defer f.Close() //启动trace goroutine err = trace.Start(f) if err != nil { panic(err) } defer trace.Stop() var star1, star2, star3 int32 var rst int32 star1 = 1 << 0 star2 = 1 << 1 star3 = 1 << 2 //rst = star1 ^ star2 ^ star3 // 三星 //rst = star1 ^ star2 // 2星 rst ^= star1 rst ^= star2 rst ^= star2 // 校验星 b1 := (rst&star1 == star1) b2 := (rst&star2 == star2) b3 := (rst&star3 == star3) fmt.Printf("%d,%d,%d,%d", star1, star2, star3, rst) fmt.Printf("%v,%v,%v,%d", b1, b2, b3, rst) var list []int32 var list2 []int32 list = []int32{1, 2, 3, 4, 5, 6, 7, 8, 9} list2 = []int32{4, 8, 9} for _, v := range list2 { for i, v1 := range list { if v == v1 { // 找到了 就删除 //conf.PrivilegeId = append(conf.PrivilegeId, v1) list = append(list[:i], list[i+1:]...) break } } } oldHero := new(pb.DBHero) oldHero.Lv = 2 new := copyPoint(oldHero) fmt.Printf("%v", new) oldHero.Lv = 8 currentTime := time.Unix(1637420154, 0) startTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location()) fmt.Print(startTime.Unix()) service = newService( rpcx.SetConfPath("../../bin/conf/worker_1.yaml"), ) service.OnInstallComp( //装备组件 s_gateComp, //此服务需要接受用户的消息 需要装备网关组件 ) go func() { lego.Run(service, //运行模块 module, items.NewModule(), user.NewModule(), equipment.NewModule(), task.NewModule(), ) }() time.Sleep(time.Second * 2) } func GetMap() map[int32]int32 { return nil } func copyPoint(m *pb.DBHero) *pb.DBHero { vt := reflect.TypeOf(m).Elem() fmt.Println(vt) newoby := reflect.New(vt) newoby.Elem().Set(reflect.ValueOf(m).Elem()) newoby.Interface().(*pb.DBHero).Lv = 1111 return newoby.Interface().(*pb.DBHero) } func CloneNewHero(hero *pb.DBHero) (newHero *pb.DBHero) { newHero = new(pb.DBHero) *newHero = *hero newHero.Block = true newHero.Lv = 100 newHero.Id = primitive.NewObjectID().Hex() return } func wordSepNormalizeFunc(f *flag.FlagSet, name string) flag.NormalizedName { from := []string{"-", "_"} to := "." for _, sep := range from { name = strings.Replace(name, sep, to, -1) } return flag.NormalizedName(name) } func Test_Modules(t *testing.T) { var iMax int64 iMax = 1 << 32 //fmt.Printf("%d", iMax) fmt.Printf("%d", (iMax << 30)) var cliName = flag.StringP("name", "n", "nick", "Input Your Name") var cliAge = flag.IntP("age", "a", 22, "Input Your Age") var cliGender = flag.StringP("gender", "g", "male", "Input Your Gender") var cliOK = flag.BoolP("ok", "o", false, "Input Are You OK") var cliDes = flag.StringP("des-detail", "d", "", "Input Description") var cliOldFlag = flag.StringP("badflag", "b", "just for test", "Input badflag") flag.CommandLine.SetNormalizeFunc(wordSepNormalizeFunc) // 为 age 参数设置 NoOptDefVal 默认值,通过简便的方式为参数设置默认值之外的值 flag.Lookup("age").NoOptDefVal = "25" // 把 badflag 参数标记为即将废弃的,请用户使用 des-detail 参数 flag.CommandLine.MarkDeprecated("badflag", "please use --des-detail instead") // 把 badflag 参数的 shorthand 标记为即将废弃的,请用户使用 des-detail 的 shorthand 参数 flag.CommandLine.MarkShorthandDeprecated("badflag", "please use -d instead") // 在帮助文档中隐藏参数 gender flag.CommandLine.MarkHidden("badflag") // 把用户传递的命令行参数解析为对应变量的值 flag.Parse() fmt.Println("name=", *cliName) fmt.Println("age=", *cliAge) fmt.Println("gender=", *cliGender) fmt.Println("ok=", *cliOK) fmt.Println("des=", *cliDes) fmt.Println("cliOldFlag=", *cliOldFlag) oldHero := new(pb.DBHero) new := copyPoint(oldHero) fmt.Printf("%v", new) data, _ := ptypes.MarshalAny(&pb.HeroListReq{}) reply := &pb.RPCMessageReply{} s_gateComp.ReceiveMsg(context.Background(), &pb.AgentMessage{UserId: "0_62c79d66acc7aa239b07c21e", MainType: "hero", SubType: "list", Message: data}, reply) log.Debugf("reply:%v", reply) }