Go言語変数の初期化

Go言語変数の初期化

 
 
前項「 Go 言語の変数宣言」でも述べたように、 Go 言語は変数を宣言する際に、その変数に対応するメモリ領域を自動的に初期化します。各変数は、その型のデフォルト値で初期化されます。次に例を示します。

 

  • 整数変数と浮動小数点変数のデフォルト値は 0 と 0.0 です。
  • 文字列変数のデフォルト値は空の文字列です。
  • ブール変数のデフォルトは bool です。
  • スライス、関数、およびポインター変数のデフォルトは nil です。

もちろん、変数を宣言するときに初期値を割り当てることもできます。

C言語を復習する

C言語では変数宣言時に、その変数に対応するメモリ領域はクリーンアップされません。この時点では、変数の値はまったく予測できない可能性があります。 C 言語で宣言する場合、開発者は初期化操作に慣れる必要があり、少し不注意であると予期せぬ結果を引き起こす可能性があります。

インターネット上でプログラマのみが理解できる「タンタンタン」「タンタンタン」という語源は、C/ C++の変数がデフォルトでは初期化されないことに由来しています。

Microsoft の VC コンパイラは、初期化されていないスタック領域を 16 進数の 0xCC で埋め、初期化されていないヒープ領域を 0xCD で埋めます。0xCCCC と 0xCDCD は、日本語 GB2312 エンコーディング文字の「ホット」と「チューン」に対応します。

変数初期化の標準形式

var 変数名 型 = 初期値

たとえば、ゲームではプレイヤーの HP の初期値は 100 です。次のように書くことができます:

var hp int = 100 

このコードでは、hp は変数名、型は int、hp の初期値は 100 です。

上記コードでは、100とintがともにint型であり、intは冗長情報とみなすことができるため、初期化の書き方をさらに簡略化することができる。

コンパイラの形式

標準形式に基づいて、int を省略した後、コンパイラは等号の右側の式に従って hp 変数の型を推測しようとします。

 変数hpを100に設定する。 

等号の右側の部分は、コンパイル理論では右辺値と呼ばれます。

以下は、右辺値から推定された変数型に基づいてコンパイラによって完了される初期化の例です。

var attack = 40 
var defence = 20
var damageRate float32 = 0.17
var damage = float32(attack-defence) * damageRate
fmt.Println(damage)

コードの説明は次のとおりです。

  • 1 行目と 2 行目では、右辺値は整数で、攻撃変数と防御変数の型は int です。
  • 3 行目では、式の右辺値に 0.17 が使用されています。 Go 言語は C 言語に似ているため、コンパイラーは計算の精度の低下を避けるために精度を高めようとします。したがって、ここでdamageRate変数の型を指定しない場合、Go言語コンパイラはdamageRate型をfloat64として推定します。ここではfloat64の精度は必要ないため、型を強制的にfloat32として指定する必要があります。 。
  • 4行目では、攻撃力と防御力を引いた結果が整数のままなので、float32()を使ってfloat32型に変換し、float32型のdamageRateを掛けると、ダメージの型もfloat32型になります。

    ヒント: ダメージ変数の右辺値は複雑な式であり、プロセス全体には攻撃操作と防御操作の両方と必須の型変換が含まれます。必須の型変換については後の章で紹介します。

  • 5行目、ダメージ値を出力します。

上記のコードの出力は次のとおりです。

3.4

短い変数の宣言と初期化

var の変数宣言をより簡潔に記述する方法もあります。次に例を示します。

 hp := 100

これは Go 言語で記述された導出ステートメントであり、コンパイラは右辺値の型に基づいて、対応する左辺値の型を自動的に推測します。

注: 代入には:= =使用されるため、導出ステートメントに記述される lvalue 変数は未定義変数である必要があります。定義するとコンパイルエラーとなります。

hp が宣言されていても:=を使用している場合、コンパイラーはエラーを報告します。コードは次のとおりです。

 // 変数hpを宣言する
var hp int
// 再度宣言して値を割り当てる
hp := 10 

コンパイルエラーは次のとおりです。

no new variables on left side of :=

これは、「:=」の左側に新しい変数が出現しないことを意味し、「:=」の左側の変数が宣言されたことを意味します。

開発中の短い変数宣言フォームの例は次のとおりです。

 conn、err:=net.Dial("tcp"、"127.0.0.1:8080") 

net.Dial は、指定されたプロトコルとアドレスに従ってネットワーク接続を開始する機能を提供します。この関数には 2 つの戻り値があり、1 つは接続オブジェクト (conn)、もう 1 つはエラー オブジェクト (err) です。標準形式では次のようになります。

 var conn net.Conn
var err error
conn, err = net.Dial("tcp", "127.0.0.1:8080") 

// 変数 conn と err を宣言する
// 127.0.0.1:8080 に TCP 接続を行う conn を宣言する
// 接続エラーが発生した場合に err にエラー内容を格納する 

したがって、開発では短い変数宣言と初期化の形式がより一般的に使用されます。

注: 複数の短い変数の宣言と代入では、少なくとも 1 つの新しく宣言された変数が左辺値に表示されます。他の変数名が繰り返し宣言されている場合でも、コンパイラーはエラーを報告しません。コードは次のとおりです。

 conn、err := net.Dial("tcp", "127.0.0.1:8080")
conn2、err := net.Dial("tcp", "127.0.0.1:8080") 

上記のコード スニペットの場合、コンパイラは定義が繰り返されてもエラーを報告しません。

 

「 Go言語変数の初期化」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
【Go言語 超入門コース】07.データ型 |変数に入れるデータの種類のことです【プログラミング初心者向け入門講座】
Share via
Copy link