3

如何在 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())

4

2 回答 2

2

地址运算符

对于 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
于 2012-10-14T12:23:36.883 回答
1

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

n := new(int64)
*n = entry.FileInfo.Size()
return &n

您也可以只获取堆栈分配的整数的地址。当返回一个指向堆栈分配对象的指针时,Go 的逃逸分析将确保该对象被提升到堆中。虽然这不会立即在堆上分配它,但它最终会在那里。

n := entry.FileInfo.Size()
return &n

至于您关于为什么该&T{}方法不适用于原语的问题,我似乎已经忘记了。我确实知道这是有充分理由的,但也许更有知识的人可以在这件事上启发我们。

于 2012-10-14T10:28:42.807 回答