This is an automated email from the ASF dual-hosted git repository.
Alanxtl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/develop by this push:
new 6dea7f500 fix(generic): honor m tags during realization (#3505)
6dea7f500 is described below
commit 6dea7f500e0e5ae6c0590a08f8ffa4cf937e639a
Author: Oxidaner <[email protected]>
AuthorDate: Wed Aug 19 22:25:34 2026 +0800
fix(generic): honor m tags during realization (#3505)
---
filter/generic/generalizer/map.go | 10 +++++++++-
filter/generic/generalizer/map_test.go | 22 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/filter/generic/generalizer/map.go
b/filter/generic/generalizer/map.go
index 2fd3c4a14..b09cc2cb1 100644
--- a/filter/generic/generalizer/map.go
+++ b/filter/generic/generalizer/map.go
@@ -68,7 +68,15 @@ func (g *MapGeneralizer) Realize(obj any, typ reflect.Type)
(any, error) {
obj = removeClass(obj)
}
newobj := reflect.New(typ).Interface()
- err := mapstructure.Decode(obj, newobj)
+ decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
+ Result: newobj,
+ TagName: "m",
+ })
+ if err != nil {
+ return nil, perrors.Errorf("creating map decoder failed, %v",
err)
+ }
+
+ err = decoder.Decode(obj)
if err != nil {
return nil, perrors.Errorf("realizing map failed, %v", err)
}
diff --git a/filter/generic/generalizer/map_test.go
b/filter/generic/generalizer/map_test.go
index 50e6d623b..00e5945eb 100644
--- a/filter/generic/generalizer/map_test.go
+++ b/filter/generic/generalizer/map_test.go
@@ -49,6 +49,11 @@ type testPlainObj struct {
EeEe int
}
+type testMTagObj struct {
+ UserID string `m:"user_id"`
+ Name string
+}
+
func TestObjToMap(t *testing.T) {
obj := &testPlainObj{}
obj.AaAa = "1"
@@ -71,6 +76,23 @@ func TestObjToMap(t *testing.T) {
assert.Equal(t, 100, m["eeEe"].(int))
}
+func TestMTagRoundTrip(t *testing.T) {
+ original := testMTagObj{
+ UserID: "42",
+ Name: "alice",
+ }
+
+ generalized, err := mockMapGeneralizer.Generalize(original)
+ require.NoError(t, err)
+ generalizedMap, ok := generalized.(map[string]any)
+ require.True(t, ok)
+ assert.Equal(t, "42", generalizedMap["user_id"])
+
+ realized, err := mockMapGeneralizer.Realize(generalized,
reflect.TypeOf(original))
+ require.NoError(t, err)
+ assert.Equal(t, original, realized)
+}
+
type testStruct struct {
AaAa string
BaBa string `m:"baBa"`