2016-02-02 5 views
9

定数のアドレスを見つけるために1つのプログラムを書いています。それはそれのようにすることは可能ですか?goで定数のアドレスを見つける

package main 

func main() { 
     const k = 5 
     address := &k 
} 

エラーが発生すると、どのようにして定数のアドレスを見つけることができますか?

答えて

10

簡潔に:できません。

エラーメッセージは言う:

は、アドレス演算子&のオペランドには制限がありますが、K

のアドレスを取ることができません。タイプTのオペランドxについてSpec: Address operators:

、書込み動作&xxにタイプ*Tのポインタを生成します。オペランドは、のアドレス指定可能なでなければなりません。つまり、変数、ポインタ間接、またはスライスのインデックス処理です。またはアドレス指定可能なstructオペランドのフィールドセレクタ。またはアドレス指定可能な配列の配列インデクシング操作である。アドレス指定可能性要件の例外として、xは(おそらくかっこにされた)composite literalでもかまいません。 xの評価でrun-time panicが発生すると、&xの評価も行われます。定数がアドレス指定可能、およびアドレス指定可能として仕様に記載されていないもの(上記引用された)がアドレス演算子&のオペランドすることはできません(あなたができないと記載されていない

それらのアドレスを取る)。

定数のアドレスを取ることはできません。これは2つの理由によるものです。

  1. 定数にはまったくアドレスがない場合があります。
  2. 実行時に定数値がメモリに格納されていても、これはランタイムが定数を保持するのに役立ちます。は定数です。定数値のアドレスを取ることができれば、変数にアドレス(ポインタ)を代入することができ、それを変更することができます(指し示された値、定数の値)。

この定数に等しい値へのポインタが必要な場合は、その変数をアドレス可能な変数に代入して、そのアドレスを取ることができます。

func main() { 
    const k = 5 
    v := k 
    address := &v // This is allowed 
} 

Goでは、数値定数は任意の精度の値を表し、オーバーフローしないことがわかります。変数に定数の値を代入すると、それが可能ではない可能性があります(たとえば、定数が変数の型の最大値よりも大きいためにコンパイル時にエラーが発生する可能性があります)。同じではない(浮動小数点定数の場合、精度が低下する可能性があります)。

+1

したがって、定数のアドレスを見つけることができません。 – Arvind

-2

セクションは明確ではありません:定数は、変数とは異なり、コンパイルされたコードや実行中のプログラムには存在しません。それらは型なしであり、変数に代入されるとメモリにのみ格納されます。

この結果、の精度は無限になります。 this exampleを見ると、定数を代入せずに変数に代入できることがわかります。変数は可能な限り多くの定数精度を保持します。


specも指摘しているように、整数は少なくとも256ビットを有する、少なくとも256ビットの仮数と32ビットの指数を浮遊し、その内部の構築物を正確保存できない場合、コンパイラはエラーをスローします定数。

+0

すべての定数が型指定されているわけではありません。 _typed_と_untyped_の定数があります。 – icza

関連する問題