Sizeof(string) is 16 bytes because a string is structure with a pointer (8 bytes) and a length (8 bytes). There’s no allocation for this structure because it’s on the stack. The allocation is for the pointed-to data, which is three bytes (string data isn’t “wide”, four bytes per code point, it’s just data). It gets allocated on the heap because you pass it to fmt.Println, so the compiler can’t guarantee it doesn’t escape beyond the lifetime of the current function call.
You’re doing a lot of microbenchmarking and questioning the results. Is there an overarching point to your explorations? If there’s one conclusion you should arrive at by now it’s that for these sorts of small things it’s all in the details. Whether there is an allocation or not depends on how the data is used, etc.