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