Memory management 直接在Go中的堆上构造一个基元类型?

Memory management 直接在Go中的堆上构造一个基元类型?,memory-management,initialization,heap,go,literals,Memory Management,Initialization,Heap,Go,Literals,如何直接在Go中的堆上构造基本整数类型 对于复合文字,支持以下选项: return &File{fd, name, nil, 0} 但是对于int和朋友,似乎没有这样的等价物: Size: &uint64(entry.FileInfo.Size()), d:\gopath\src\bitbucket.org\anacrolix\dms\dlna\dms\dms.go:271:无法获取uint64的地址(entry.FileInfo.Size()) 使用new初始化指向类型的指

如何直接在Go中的堆上构造基本整数类型

对于复合文字,支持以下选项:

return &File{fd, name, nil, 0}
但是对于
int
和朋友,似乎没有这样的等价物:

Size: &uint64(entry.FileInfo.Size()),
d:\gopath\src\bitbucket.org\anacrolix\dms\dlna\dms\dms.go:271:无法获取uint64的地址(entry.FileInfo.Size())


使用
new
初始化指向类型的指针时,总是在堆上分配它

n := new(int64)
*n = entry.FileInfo.Size()
return &n
您也可以只获取堆栈分配的整数的地址。 当返回指向堆栈分配对象的指针时,Go的转义分析将确保将该对象提升到堆中。虽然这不会立即在堆上分配它,但它最终会在堆上分配

n := entry.FileInfo.Size()
return &n
至于你关于为什么
&T{}
方法不适用于原语的问题,我似乎已经忘记了。我确实知道这样做有一个很好的理由,但也许有一个更有知识的人可以在这件事上启发我们

对于类型为T的操作数x,地址操作&x生成 类型为*T的指针指向x。操作数必须是可寻址的,即, 变量、指针间接寻址或切片索引操作; 或可寻址结构操作数的字段选择器;还是数组 可寻址数组的索引操作。作为一个例外 可寻址性要求,x也可以是复合文字

基元整数类型不可寻址。如果整数是寄存器变量,则没有内存地址。如果整数是常量,提供其内存地址将允许对其进行修改

因此,创建一个整型变量并获取其地址或使用整型指针类型。比如说,

package main

import "fmt"

func main() {
    var i int = 42
    var pi = &i
    j := int(7)
    pj := &j
    var pk = new(int)
    k := *pk
    fmt.Println(i, pi)
    fmt.Println(j, pj)
    fmt.Println(k, pk)
}
输出:

42 0xf840043100
7 0xf840043108
0 0xf840043110