* d...@veryhaha.com <d...@veryhaha.com> [180225 11:37]:
> I think I get it.
> Because the above program tries to modify the constant (or program) zone, 
> which is not allowed.
> The following program works:

But, note that the language spec does not guarantee it to work.  The
compiler is free to recognize what that first line is doing and optimize
the assignment into a string in a R/O memory segment.  The optimization
is legal because the compiler does not have to recognize the use of
unsafe to determine the programmer's intent to subvert the type system.

> package main
> 
> import "fmt"
> import "unsafe"
> import "reflect"
> 
> func main() {
>     s := string([]byte{'k', 'e', 'e', 'p'})
>     hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
>     byteSequence := (*byte)(unsafe.Pointer(hdr.Data))
>     fmt.Println(string(*byteSequence)) // k
>     *byteSequence = 'j' // crash here
>     fmt.Println(s) // expect: jeep
> }

...Marvin

-- 
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.

Reply via email to