Not sure if that's a good idea. Strings are immutable so you can pass 
string to function by reference, in thread safe manner. So if you pass same 
string to 2 threads and one of them modify it - you'll really have 
allocate+copy+modify so you're never touching the original thing so you 
can't have a race.

Now if go introduced readolny []byte, we'd probably want to change all io 
functions to use that... and this would create a lot of confusion, because 
it'd be required to cast []byte to readonly version. And this casted 
variable wouldn't be readonly nor thread-safe at all, because underlying 
memory could still be changed using the original slice. So we'd need 
allocate+memcopy for readonly cast to do a network write.

Or maybe there could be readonly []byte version for each io op. But it'd 
result only in many unnecessary OS calls.

So what is needed in this case (i guess) is a reusable buffer anyway, and then 
you can do a copy to a byte buffer without a cast and allocation

tstr := "abc"
t := make([]byte, 10, 10)

copy(t, tstr)


W dniu piątek, 5 lipca 2019 04:27:58 UTC+2 użytkownik Ally Dale napisał:
>
> []byte is mutable in Go, but string is readonly, so []byte(string) in Go 
> is actually allocate&memcopy, and this operation is costly.
> Sometimes, we need a readonly []byte parameter but we have string only, 
> and we have no choice but allocate&memcopy to make a new []byte variable 
> from string.
> Eg: net.Send([]byte("ping")) is costly, but net.Send(readonly 
> []byte("ping")) can be cheaply.
>

-- 
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/804e9ecf-4d2e-4ffd-8cca-1a9c91928bb9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to