Thanks Ian, that's a very interesting solution.

Is there a solution for going in the other direction? Although I excluded 
it from the initial post, it was only to reduce the size of the discussion. 
I would also like to implement

func BytesToString(b []byte) string { 

I don't clearly see how to avoid using the StringHeader in this case.

F

On Wednesday, 18 September 2019 22:46:44 UTC+2, Ian Lance Taylor wrote:
>
> On Wed, Sep 18, 2019 at 2:42 AM Francis <francis...@gmail.com 
> <javascript:>> wrote: 
> > 
> > I am looking at the correct way to convert from a byte slice to a string 
> and back with no allocations. All very unsafe. 
> > 
> > I think these two cases are fairly symmetrical. So to simplify the 
> discussion below I will only talk about converting from a string to []byte. 
> > 
> > func StringToBytes(s string) (b []byte) 
>
> No reason to use SliceHeader, and avoiding SliceHeader avoids the 
> problems you discuss. 
>
> func StringToBytes(s string) []byte { 
>     const max = 0x7fff0000 
>     if len(s) > max { 
>         panic("string too long") 
>     } 
>     return 
> (*[max]byte)(unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&s)).Data))[:len(s):len(s)]
>  
>
> } 
>
> Of course, as you say, you must not mutate the returned []byte. 
>
> Ian 
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/be75e878-3251-4e44-9138-fa8556bf0595%40googlegroups.com.

Reply via email to