fix(fight): 修复战斗逻辑中的一些潜在问题 - 在 `fight_leitai.go` 中增加玩家是否可以战斗的判断,避免非法挑战 - 注释掉部分冗余的日志打印与广播调用,并调整了擂台状态更新逻辑 - 修正 `effect_62.go` 中镇魂歌效果持续时间的处理方式,引入独立计数器 `duy` - 优化随机精灵生成逻辑,确保 CatchTime 正确设置 - 增加对数据库操作错误的 panic 处理,提高代码健壮性 - 调整部分结构体指针传递,统一返回结构体指针以避免拷贝问题 - 移除未使用的导入包和调试日志,清理无用代码 ```
struc
Struc exists to pack and unpack C-style structures from bytes, which is useful for binary files and network protocols. It could be considered an alternative to encoding/binary, which requires massive boilerplate for some similar operations.
Take a look at an example comparing struc and encoding/binary
Struc considers usability first. That said, it does cache reflection data and aims to be competitive with encoding/binary struct packing in every way, including performance.
Example struct
type Example struct {
Var int `struc:"int32,sizeof=Str"`
Str string
Weird []byte `struc:"[8]int64"`
Weird []byte `struc:"[32]byte"`
Var []int `struc:"[]int32,little"`
}
Struct tag format
Var []int `struc:"[]int32,little,sizeof=StringField"`will pack Var as a slice of little-endian int32, and link it as the size ofStringField.sizeof=: Indicates this field is a number used to track the length of a another field.sizeoffields are automatically updated onPack()based on the current length of the tracked field, and are used to size the target field duringUnpack().- Bare values will be parsed as type and endianness.
Endian formats
big(default)little
Recognized types
pad- this type ignores field contents and is backed by a[length]bytecontaining nullsboolbyteint8,uint8int16,uint16int32,uint32int64,uint64float32float64
Types can be indicated as arrays/slices using [] syntax. Example: []int64, [8]int32.
Bare slice types (those with no [size]) must have a linked Sizeof field.
Private fields are ignored when packing and unpacking.
Example code
package main
import (
"bytes"
"github.com/lunixbochs/struc"
)
type Example struct {
A int `struc:"big"`
// B will be encoded/decoded as a 16-bit int (a "short")
// but is stored as a native int in the struct
B int `struc:"int16"`
// the sizeof key links a buffer's size to any int field
Size int `struc:"int8,little,sizeof=Str"`
Str string
// you can get freaky if you want
Str2 string `struc:"[5]int64"`
}
func main() {
var buf bytes.Buffer
t := &Example{1, 2, 0, "test", "test2"}
err := struc.Pack(&buf, t)
o := &Example{}
err = struc.Unpack(&buf, o)
}
Benchmark
BenchmarkEncode uses struc. Stdlib benchmarks use equivalent encoding/binary code. Manual encodes without any reflection, and should be considered an upper bound on performance (which generated code based on struc definitions should be able to achieve).
BenchmarkEncode 1000000 1265 ns/op
BenchmarkStdlibEncode 1000000 1855 ns/op
BenchmarkManualEncode 5000000 284 ns/op
BenchmarkDecode 1000000 1259 ns/op
BenchmarkStdlibDecode 1000000 1656 ns/op
BenchmarkManualDecode 20000000 89.0 ns/op