package main
import (
"fmt"
"unsafe"
)
func main() {
showString("12345")
}
func showString(s string) {
res := *(*[unsafe.Sizeof(s)]byte)(unsafe.Pointer(&s))
fmt.Println(s, res, []byte(s))
for i := range res {
fmt.Printf("%.2x", res[i])
}
fmt.Println()
}
//Output:
// 12345 [205 84 75 0 0 0 0 0 5 0 0 0 0 0 0 0] [49 50 51 52 53]
// cd544b00000000000500000000000000
If I change fmt.Printf("%.2x ",res[i])
for i := range res {
fmt.Printf("%.2x ", res[i])
}
//Output:
// 12345 [206 84 75 0 0 0 0 0 5 0 0 0 0 0 0 0] [49 50 51 52 53]
// ce 54 4b 00 00 00 00 00 05 00 00 00 00 00 00 00
Ouput changes, why is it, like that?
How Strings are actually represented in go?(underlying representation)
When type casting, why unsafe.Sizeof(x), is accepted as size, but not
someother function which returns the same value with same type.
res := *(*[si(s)]byte)(unsafe.Pointer(&s)) //This is not valid,
non-constant array bound
func si(s string) uintptr {
return unsafe.Sizeof(s)
}
But works completely fine for unsafe.Sizeof(s).
--
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.