http://play.golang.org/p/BgnHN-GikU
var p1 = new(int)
var p2 *int = new(int)
var p3 = 0
var p4 *int
func main() {
fmt.Println(*p1, &p1, p1)
fmt.Println()
fmt.Println(*p2, &p2, p2)
fmt.Println()
fmt.Println(p3, &p3)
fmt.Println()
fmt.Println(p4, &p4)
}
0 0x206a10 0x104382e0
0 0x206a14 0x104382f0
0 0x21ccc0
<nil>
0x206a18
答案 0 :(得分:6)
不是地址大小有什么不同,它是您打印时十六进制表示的大小(长度)。
您在Go Playground上打印的所有地址都是4个字节,但如果第一个字节(或位)为零,则不会打印它们。
此外,如果仔细观察,全局变量的地址有6个六位数,new()
分配和返回的指针有8个六位数。这是因为那些int
s(由new()
返回)在堆上分配了更大的偏移量(因此&#34;更大的&#34;内存地址)。
例如:
var i, j int32 = 123, 123000
fmt.Printf("%x %x\n", i, j)
打印7b 1e078
,即使两个数字都是4个字节长(32位)。您可以使用格式字符串添加填充0
,如下所示:
fmt.Printf("%08x %08x\n", i, j)
这导致0000007b 0001e078
,但即使i
或j
为&#34;较少&#34;超过4个字节(例如int16
),因此这个填充不会告诉您它们是否具有不同的大小。