Fix structtags
This commit is contained in:
parent
8ee0f793b5
commit
e7909f0857
3 changed files with 12 additions and 20 deletions
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue