diff --git a/structtags/README.md b/structtags/README.md index 9b6c916..23ce5ed 100644 --- a/structtags/README.md +++ b/structtags/README.md @@ -8,8 +8,9 @@ goos: linux goarch: amd64 pkg: gitlab.com/slon/shad-go/structtags -BenchmarkUnpacker/user-4 3064 362500 ns/op -BenchmarkUnpacker/user+good+order-4 663 1799294 ns/op +cpu: Intel(R) Core(TM) i7-6600U CPU @ 2.60GHz +BenchmarkUnpacker/user-4 4269022 275.0 ns/op +BenchmarkUnpacker/user+good+order-4 732264 1481 ns/op PASS ``` diff --git a/structtags/structtags.go b/structtags/structtags.go index ee92447..b40187f 100644 --- a/structtags/structtags.go +++ b/structtags/structtags.go @@ -10,18 +10,11 @@ import ( "strings" ) -// Функция Unpack присваивает значения параметров из url query в поля переданной структуры. - -// Для этого сначала в первом цикле создается map, -// где ключи -- названия параметров из url query, -// а значения -- "ссылки" на соответствующие поля структуры. - -// В следующем цикле поля структуры заполняются соответствующими -// значениями из url query. func Unpack(req *http.Request, ptr interface{}) error { if err := req.ParseForm(); err != nil { return err } + fields := make(map[string]reflect.Value) v := reflect.ValueOf(ptr).Elem() for i := 0; i < v.NumField(); i++ { @@ -33,11 +26,13 @@ func Unpack(req *http.Request, ptr interface{}) error { } fields[name] = v.Field(i) } + for name, values := range req.Form { - f := fields[name] - if !f.IsValid() { + f, ok := fields[name] + if !ok { continue } + for _, value := range values { if f.Kind() == reflect.Slice { elem := reflect.New(f.Type().Elem()).Elem() diff --git a/structtags/structtags_test.go b/structtags/structtags_test.go index 6204622..9c0125c 100644 --- a/structtags/structtags_test.go +++ b/structtags/structtags_test.go @@ -139,19 +139,15 @@ func BenchmarkUnpacker(b *testing.B) { b.Run("user", func(b *testing.B) { for i := 0; i < b.N; i++ { - for j := 0; j < 1000; j++ { - _ = Unpack(userRequest, user) - } + _ = Unpack(userRequest, user) } }) b.Run("user+good+order", func(b *testing.B) { for i := 0; i < b.N; i++ { - for j := 0; j < 1000; j++ { - _ = Unpack(userRequest, user) - _ = Unpack(goodRequest, good) - _ = Unpack(orderRequest, order) - } + _ = Unpack(userRequest, user) + _ = Unpack(goodRequest, good) + _ = Unpack(orderRequest, order) } }) }