定数のアドレスを見つけるために1つのプログラムを書いています。それはそれのようにすることは可能ですか?goで定数のアドレスを見つける
package main
func main() {
const k = 5
address := &k
}
エラーが発生すると、どのようにして定数のアドレスを見つけることができますか?
定数のアドレスを見つけるために1つのプログラムを書いています。それはそれのようにすることは可能ですか?goで定数のアドレスを見つける
package main
func main() {
const k = 5
address := &k
}
エラーが発生すると、どのようにして定数のアドレスを見つけることができますか?
簡潔に:できません。
エラーメッセージは言う:
は、アドレス演算子
&
のオペランドには制限がありますが、K
のアドレスを取ることができません。タイプT
のオペランドx
についてSpec: Address operators:
、書込み動作
&x
はx
にタイプ*T
のポインタを生成します。オペランドは、のアドレス指定可能なでなければなりません。つまり、変数、ポインタ間接、またはスライスのインデックス処理です。またはアドレス指定可能なstructオペランドのフィールドセレクタ。またはアドレス指定可能な配列の配列インデクシング操作である。アドレス指定可能性要件の例外として、x
は(おそらくかっこにされた)composite literalでもかまいません。x
の評価でrun-time panicが発生すると、&x
の評価も行われます。定数がアドレス指定可能、およびアドレス指定可能として仕様に記載されていないもの(上記引用された)がアドレス演算子&
のオペランドすることはできません(あなたができないと記載されていない
それらのアドレスを取る)。
定数のアドレスを取ることはできません。これは2つの理由によるものです。
この定数に等しい値へのポインタが必要な場合は、その変数をアドレス可能な変数に代入して、そのアドレスを取ることができます。
func main() {
const k = 5
v := k
address := &v // This is allowed
}
Goでは、数値定数は任意の精度の値を表し、オーバーフローしないことがわかります。変数に定数の値を代入すると、それが可能ではない可能性があります(たとえば、定数が変数の型の最大値よりも大きいためにコンパイル時にエラーが発生する可能性があります)。同じではない(浮動小数点定数の場合、精度が低下する可能性があります)。
セクションは明確ではありません:定数は、変数とは異なり、コンパイルされたコードや実行中のプログラムには存在しません。それらは型なしであり、変数に代入されるとメモリにのみ格納されます。
この結果、の精度は無限になります。 this exampleを見ると、定数を代入せずに変数に代入できることがわかります。変数は可能な限り多くの定数精度を保持します。
specも指摘しているように、整数は少なくとも256ビットを有する、少なくとも256ビットの仮数と32ビットの指数を浮遊し、その内部の構築物を正確保存できない場合、コンパイラはエラーをスローします定数。
すべての定数が型指定されているわけではありません。 _typed_と_untyped_の定数があります。 – icza
したがって、定数のアドレスを見つけることができません。 – Arvind