From f29951c8990f0d31d1bacc27393ac88e3edf7e21 Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Fri, 2 Jun 2017 16:19:43 +0300 Subject: [PATCH] Speedup ScanSlice --- internal/proto/scan.go | 2 +- internal/safe.go | 4 ++++ internal/unsafe.go | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/internal/proto/scan.go b/internal/proto/scan.go index a73a369..3ab40b9 100644 --- a/internal/proto/scan.go +++ b/internal/proto/scan.go @@ -122,7 +122,7 @@ func ScanSlice(data []string, slice interface{}) error { for i, s := range data { elem := internal.SliceNextElem(v) - if err := Scan([]byte(s), elem.Addr().Interface()); err != nil { + if err := Scan(internal.StringToBytes(s), elem.Addr().Interface()); err != nil { return fmt.Errorf("redis: ScanSlice(index=%d value=%q) failed: %s", i, s, err) } } diff --git a/internal/safe.go b/internal/safe.go index dc5f4cc..870fe54 100644 --- a/internal/safe.go +++ b/internal/safe.go @@ -5,3 +5,7 @@ package internal func BytesToString(b []byte) string { return string(b) } + +func StringToBytes(s string) []byte { + return []byte(s) +} diff --git a/internal/unsafe.go b/internal/unsafe.go index 94e4a9d..c18b25c 100644 --- a/internal/unsafe.go +++ b/internal/unsafe.go @@ -9,6 +9,19 @@ import ( func BytesToString(b []byte) string { bytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - strHeader := reflect.StringHeader{bytesHeader.Data, bytesHeader.Len} + strHeader := reflect.StringHeader{ + Data: bytesHeader.Data, + Len: bytesHeader.Len, + } return *(*string)(unsafe.Pointer(&strHeader)) } + +func StringToBytes(s string) []byte { + sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) + bh := reflect.SliceHeader{ + Data: sh.Data, + Len: sh.Len, + Cap: sh.Len, + } + return *(*[]byte)(unsafe.Pointer(&bh)) +}