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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.