如何在 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())
如何在 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())
对于 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
使用 初始化指向类型的指针new
,总是在堆上分配它。
n := new(int64)
*n = entry.FileInfo.Size()
return &n
您也可以只获取堆栈分配的整数的地址。当返回一个指向堆栈分配对象的指针时,Go 的逃逸分析将确保该对象被提升到堆中。虽然这不会立即在堆上分配它,但它最终会在那里。
n := entry.FileInfo.Size()
return &n
至于您关于为什么该&T{}
方法不适用于原语的问题,我似乎已经忘记了。我确实知道这是有充分理由的,但也许更有知识的人可以在这件事上启发我们。