Skip to content

Commit 42efe7c

Browse files
committed
fix: 增强SetFields函数的参数类型检查,支持类型转换
test: 添加MapStruct函数的单元测试,验证结构体映射功能
1 parent cd61b70 commit 42efe7c

File tree

4 files changed

+76
-12
lines changed

4 files changed

+76
-12
lines changed

database/mapper/render.go

+14-1
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,23 @@ func SetFields[S any, T any](source S, target T, ignoreZero bool) (err error) {
5252
setterName := "Set" + strings.Title(field.Name)
5353
method := targetValue.Addr().MethodByName(setterName)
5454
if method.IsValid() {
55-
args := []reflect.Value{fieldValue}
55+
if method.Type().NumIn() != 1 {
56+
err = fmt.Errorf("method %s must have one parameter", setterName)
57+
return
58+
}
59+
methodParamType := method.Type().In(0)
60+
if method.Type().In(0) != fieldValue.Type() {
61+
if fieldValue.Type().ConvertibleTo(methodParamType) {
62+
fieldValue = fieldValue.Convert(methodParamType)
63+
} else {
64+
err = fmt.Errorf("method %s parameter type must be %s, but got %s", setterName, methodParamType, fieldValue.Type())
65+
return
66+
}
67+
}
5668
if ignoreZero && fieldValue.IsZero() {
5769
continue
5870
}
71+
args := []reflect.Value{fieldValue}
5972
method.Call(args)
6073
}
6174
}

database/mapper/render_test.go

+36-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type Target struct {
1818
}
1919

2020
func (t *Target) SetName(name string) { t.name = &name }
21-
func (t *Target) SetAge(age int) { t.age = age }
21+
func (t *Target) SetAge(age int64) { t.age = int(age) }
2222
func (t *Target) SetIsActive(isActive bool) { t.isActive = isActive }
2323

2424
func TestSetFields(t *testing.T) {
@@ -88,3 +88,38 @@ func TestSetFields(t *testing.T) {
8888
})
8989
}
9090
}
91+
92+
func TestMapStruct(t *testing.T) {
93+
type structA struct {
94+
Name string `json:"name"`
95+
Age int `json:"age"`
96+
Raw []byte `json:"raw"`
97+
}
98+
99+
type structB struct {
100+
Name *string `json:"name"`
101+
Age int `json:"age"`
102+
Raw []byte `json:"raw"`
103+
}
104+
105+
a := structA{
106+
Name: "Alice",
107+
Age: 25,
108+
Raw: []byte("raw"),
109+
}
110+
b := MapStruct[structA, structB](&a)
111+
if b == nil {
112+
t.Errorf("MapStruct() error = %v", b)
113+
return
114+
}
115+
if *b.Name != a.Name {
116+
t.Errorf("MapStruct() = %v, want %v", *b.Name, a.Name)
117+
}
118+
if b.Age != a.Age {
119+
t.Errorf("MapStruct() = %v, want %v", b.Age, a.Age)
120+
}
121+
if string(b.Raw) != string(a.Raw) {
122+
t.Errorf("MapStruct() = %v, want %v", string(b.Raw), string(a.Raw))
123+
}
124+
t.Logf("MapStruct() = %+v", *b)
125+
}

layout/go.mod

+10-10
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ replace github.com/TBXark/sphere => ../
99
require (
1010
entgo.io/ent v0.14.2
1111
github.com/TBXark/confstore v0.0.0-20250213133642-966f3d3fb351
12-
github.com/TBXark/sphere v0.0.0-20250212142829-4888dc2f7f00
13-
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250218102724-7c0e6450359f
14-
github.com/alitto/pond/v2 v2.1.6
12+
github.com/TBXark/sphere v0.0.0-20250220092258-cd61b708e243
13+
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250220092258-cd61b708e243
14+
github.com/alitto/pond/v2 v2.2.0
1515
github.com/gin-contrib/gzip v1.2.2
1616
github.com/gin-gonic/gin v1.10.0
17-
github.com/go-sql-driver/mysql v1.8.1
17+
github.com/go-sql-driver/mysql v1.9.0
1818
github.com/google/wire v0.6.0
1919
github.com/samber/lo v1.49.1
20-
github.com/spf13/cobra v1.9.0
20+
github.com/spf13/cobra v1.9.1
2121
github.com/swaggo/swag v1.16.4
2222
github.com/tbxark/options-proto/go v0.0.0-20241107032846-d46ef06aa5e1
2323
golang.org/x/sync v0.11.0
24-
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b
24+
google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2
2525
google.golang.org/protobuf v1.36.5
2626
)
2727

@@ -36,7 +36,7 @@ require (
3636
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
3737
github.com/bmatcuk/doublestar v1.3.4 // indirect
3838
github.com/bufbuild/protocompile v0.14.1 // indirect
39-
github.com/bytedance/sonic v1.12.8 // indirect
39+
github.com/bytedance/sonic v1.12.9 // indirect
4040
github.com/bytedance/sonic/loader v0.2.3 // indirect
4141
github.com/cloudwego/base64x v0.1.5 // indirect
4242
github.com/dustin/go-humanize v1.0.1 // indirect
@@ -87,7 +87,7 @@ require (
8787
github.com/swaggo/gin-swagger v1.6.0 // indirect
8888
github.com/tidwall/gjson v1.18.0 // indirect
8989
github.com/tidwall/match v1.1.1 // indirect
90-
github.com/tidwall/pretty v1.2.0 // indirect
90+
github.com/tidwall/pretty v1.2.1 // indirect
9191
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
9292
github.com/ugorji/go/codec v1.2.12 // indirect
9393
github.com/yitter/idgenerator-go v1.3.3 // indirect
@@ -97,7 +97,7 @@ require (
9797
go.uber.org/zap v1.27.0 // indirect
9898
golang.org/x/arch v0.14.0 // indirect
9999
golang.org/x/crypto v0.33.0 // indirect
100-
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect
100+
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
101101
golang.org/x/mod v0.23.0 // indirect
102102
golang.org/x/net v0.35.0 // indirect
103103
golang.org/x/sys v0.30.0 // indirect
@@ -110,5 +110,5 @@ require (
110110
modernc.org/libc v1.61.13 // indirect
111111
modernc.org/mathutil v1.7.1 // indirect
112112
modernc.org/memory v1.8.2 // indirect
113-
modernc.org/sqlite v1.34.5 // indirect
113+
modernc.org/sqlite v1.35.0 // indirect
114114
)

layout/go.sum

+16
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@ github.com/TBXark/confstore v0.0.0-20250213133642-966f3d3fb351 h1:IXml5XiUSzU/uM
1515
github.com/TBXark/confstore v0.0.0-20250213133642-966f3d3fb351/go.mod h1:TOxM19Snt9wT02PJzyz66sgq7sWhr4AFzPEZIKvVnTE=
1616
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250218102724-7c0e6450359f h1:QCpA/EF50FCYIsMPp33lHqEctThMlfUK8x4lg8phJM4=
1717
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250218102724-7c0e6450359f/go.mod h1:HueNXO16ruwOyRkRexKr07P3IkMhnt1X2uypmEaV3Hs=
18+
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250220092258-cd61b708e243 h1:diu7bwwkJ9htpdDP69ufwFgKXM8TBeeum+hTzPv9xbQ=
19+
github.com/TBXark/sphere/contrib/json-gen-proto v0.0.0-20250220092258-cd61b708e243/go.mod h1:HueNXO16ruwOyRkRexKr07P3IkMhnt1X2uypmEaV3Hs=
1820
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
1921
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
2022
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4=
2123
github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI=
2224
github.com/alitto/pond/v2 v2.1.6 h1:6U3nSOjxpuNyvjIKjjRkpS2JDdgX5JqBm9GO2urcCjM=
2325
github.com/alitto/pond/v2 v2.1.6/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE=
26+
github.com/alitto/pond/v2 v2.2.0 h1:hX3B1Lu4b5PjSHR+IWNRDKD0Jfw2ew8V25J7Vu5j7RM=
27+
github.com/alitto/pond/v2 v2.2.0/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE=
2428
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
2529
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
2630
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
@@ -31,6 +35,8 @@ github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/
3135
github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c=
3236
github.com/bytedance/sonic v1.12.8 h1:4xYRVRlXIgvSZ4e8iVTlMF5szgpXd4AfvuWgA8I8lgs=
3337
github.com/bytedance/sonic v1.12.8/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
38+
github.com/bytedance/sonic v1.12.9 h1:Od1BvK55NnewtGaJsTDeAOSnLVO2BTSLOe0+ooKokmQ=
39+
github.com/bytedance/sonic v1.12.9/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
3440
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
3541
github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0=
3642
github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
@@ -88,6 +94,8 @@ github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0
8894
github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
8995
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
9096
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
97+
github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo=
98+
github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw=
9199
github.com/go-telegram/bot v1.14.0 h1:qknBErnf5O1CTWZDdDK/qqV8f7wWTf98gFIVW42m6dk=
92100
github.com/go-telegram/bot v1.14.0/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM=
93101
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
@@ -190,6 +198,8 @@ github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
190198
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
191199
github.com/spf13/cobra v1.9.0 h1:Py5fIuq/lJsRYxcxfOtsJqpmwJWCMOUy2tMJYV8TNHE=
192200
github.com/spf13/cobra v1.9.0/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
201+
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
202+
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
193203
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
194204
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
195205
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -220,6 +230,8 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
220230
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
221231
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
222232
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
233+
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
234+
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
223235
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
224236
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
225237
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
@@ -248,6 +260,7 @@ golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
248260
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
249261
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=
250262
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=
263+
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
251264
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
252265
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
253266
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -315,6 +328,8 @@ golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY
315328
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
316329
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b h1:i+d0RZa8Hs2L/MuaOQYI+krthcxdEbEM2N+Tf3kJ4zk=
317330
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
331+
google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4=
332+
google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA=
318333
google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I=
319334
google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
320335
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
@@ -354,6 +369,7 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
354369
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
355370
modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g=
356371
modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE=
372+
modernc.org/sqlite v1.35.0/go.mod h1:9cr2sicr7jIaWTBKQmAxQLfBv9LL0su4ZTEV+utt3ic=
357373
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
358374
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
359375
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=

0 commit comments

Comments
 (0)