From 114dd835b9bb71a63a102a8d0931b0b8fe3fdd51 Mon Sep 17 00:00:00 2001 From: highcloudwind Date: Wed, 11 Nov 2026 11:29:42 +0800 Subject: [PATCH] fix(bind): convert named string map keys before insertion Signed-off-by: highcloudwind --- bind.go | 7 ++++--- bind_test.go | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/bind.go b/bind.go index bec2e3b3a..57a8d9402 100644 --- a/bind.go +++ b/bind.go @@ -241,14 +241,15 @@ func bindData(destination any, data map[string][]string, tag string, dataFiles m val.Set(reflect.MakeMap(typ)) } for k, v := range data { + key := reflect.ValueOf(k).Convert(typ.Key()) if isElemString { - val.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v[0])) + val.SetMapIndex(key, reflect.ValueOf(v[0])) } else if isElemInterface { // To maintain backward compatibility, we always bind to the first string value // and not the slice of strings when dealing with map[string]any{} - val.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v[0])) + val.SetMapIndex(key, reflect.ValueOf(v[0])) } else { - val.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v)) + val.SetMapIndex(key, reflect.ValueOf(v)) } } return nil diff --git a/bind_test.go b/bind_test.go index 771c59fb8..4a314a4d5 100644 --- a/bind_test.go +++ b/bind_test.go @@ -542,6 +542,26 @@ func TestDefaultBinder_bindDataToMap(t *testing.T) { }) } +func TestBindDataToMapWithNamedStringKey(t *testing.T) { + type key string + data := map[string][]string{"name": {"first", "second"}} + t.Run("string values", func(t *testing.T) { + var dest map[key]string + assert.NoError(t, bindData(&dest, data, "query", nil)) + assert.Equal(t, map[key]string{"name": "first"}, dest) + }) + t.Run("slice values", func(t *testing.T) { + var dest map[key][]string + assert.NoError(t, bindData(&dest, data, "query", nil)) + assert.Equal(t, map[key][]string{"name": {"first", "second"}}, dest) + }) + t.Run("interface values", func(t *testing.T) { + var dest map[key]any + assert.NoError(t, bindData(&dest, data, "query", nil)) + assert.Equal(t, map[key]any{"name": "first"}, dest) + }) +} + func TestBindbindData(t *testing.T) { ts := new(bindTestStruct) err := bindData(ts, values, "form", nil)