I don't like the extra allocation and copies involved when casting from
byte slice to string or vice versa just because one type or the other is
required. The code below reuses the data pointer and as far as I can tell
in my tests so far, it even works well with garbage collection. My question
is... why shouldn't I do this?
func fastStringToBytes(str string) []byte {
var b []byte
strhdr := (*reflect.StringHeader)(unsafe.Pointer(&str))
bythdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
d := strhdr.Data
l := strhdr.Len
// strhdr.Data = bythdr.Data
// strhdr.Len = bythdr.Len
bythdr.Data = d
bythdr.Len = l
bythdr.Cap = l
return b
}
func fastBytesToString(b []byte) string {
var str string
strhdr := (*reflect.StringHeader)(unsafe.Pointer(&str))
bythdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
// d := strhdr.Data
// l := strhdr.Len
strhdr.Data = bythdr.Data
strhdr.Len = bythdr.Len
// bythdr.Data = d
// bythdr.Len = l
// bythdr.Cap = l
return str
}
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.