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 に答える