「Go Language レッスン 1」コース学習ノート (9)

定数: Go の「定数」の設計にはどのような革新がありますか?

  • 定数に関する Go 言語の革新には次のようなものがあります。
    • 型なし定数のサポート。
    • 暗黙的な自動変換のサポート。
    • enum の実装に使用できます。

絶え間ない

  • Go の定数は、ソース コードのコンパイル中に作成される構文要素です。つまり、この要素の値は変数のように初期化できますが、その初期化式はコンパイル中に値を評価できる必要があります。
    • Go 定数が宣言されて初期化されると、その値はプログラムの存続期間を通じて一定のままになります。
    • 同時設計時に定数アクセスの同期を考慮する必要がなく、作成・初期化した定数を他の定数の初期式の一部として使用することもできます。
  • Go では、var キーワードを使用して変数を宣言します。定数の場合、Go 言語では定数を宣言するための const キーワードが導入されています。さらに、var が 1 行での複数の変数の宣言とコード ブロックでの変数宣言の集約をサポートするのと同様に、const も 1 行での複数の定数の宣言とコード ブロックでの定数宣言の集約をサポートします。
    const Pi float64 = 3.14159265358979323846 // 单行常量声明
    // 以 const 代码块形式声明常量
    const (
    	size int64 = 4096
    	i, j, s = 13, 14, "bar" // 单行声明多个常量
    )
    
  • Go 言語仕様では、Go 定数の型は、数値型、文字列型、および 2 つの値 (true と false) のみを持つブール型を含む、Go の基本データ型に限定されると規定されています。

型なし定数

  • Go 言語にはタイプ セーフに関する厳しい要件があります。2 つの型が同じ基底型を持つ場合でも、それらは依然として異なるデータ型であり、相互に比較したり、演算式で混合したりすることはできません。この要件は変数だけでなく、型付き定数にも適用されます。
  • 型の定数と変数が計算や評価のために混合される場合、同じ型の要件も満たさなければなりません。そうでない場合は、明示的な変換を通じてのみコードを適切に動作させることができます。
  • 定数は宣言時に型が明示的に割り当てられていないため、Go ではこのような定数を型なし定数 (Untyped Constant) と呼びます。
  • 型なし定数は、実際に型がないことを意味するわけではなく、独自のデフォルト型もありますが、そのデフォルト型は初期値の形式に従って決定されます。

暗黙的な変換

  • 暗黙的な変換とは、型なし定数を含む式の評価の場合、Go コンパイラーがコンテキスト内の型情報に従って、型なし定数を対応する型に自動的に変換し、評価計算に参加することを意味します。
  • ただし、変換されたオブジェクトは定数であるため、型安全性の問題は発生せず、Go コンパイラーはこの変換の安全性を保証します。

列挙を実装する

  • 実際、Go 言語では列挙型がネイティブに提供されていないため、const コード ブロックで定義された定数コレクションを使用して列挙型を実装できます。
  • まず、Go の const 構文は、「前の非 null 式を暗黙的に繰り返す」ためのメカニズムを提供します。
    const (
    	Apple, Banana = 11, 22
    	Strawberry, Grape
    	Pear, Watermelon
    )
    
    • このコードでは、定数定義の最後の 2 行には初期値が明示的に割り当てられていないため、Go コンパイラーはそれらに対して前の行の式を自動的に使用します。
      const (
      	Apple, Banana = 11, 22
      	Strawberry, Grape = 11, 22
      	Pear, Watermelon = 11, 22
      )
      
    • ただし、列挙型の各列挙定数の値は一意であるため、前の行を繰り返すだけでは明らかに「列挙」の要件を満たすことができません。したがって、Go はこの機能に基づいた「アーティファクト」、iota を提供します。
      • iota は Go 言語の事前定義された識別子で、const 宣言ブロック (単一行宣言を含む) 内のブロック内の各定数のオフセット値 (0 から始まる) を表します。
      • 同時に、各行の iota は型なし定数でもあり、明示的な変換操作を実行することなく、さまざまな型の評価プロセスに自動的に参加できます。
        const (
        	Apple, Banana = iota, iota + 10 // 0, 10 (iota = 0)
        	Strawberry, Grape // 1, 11 (iota = 1)
        	Pear, Watermelon // 2, 12 (iota = 2)
        )
        
    • Go ソース ファイル内の複数の const コード ブロックによって定義された異なる列挙がある場合、各 const コード ブロックの iota も独立して変更されます。つまり、各 const コード ブロックは独自の iota を持ちます。
    • 各イオタの有効期間は、const コード ブロックの開始時に始まり、その const コード ブロックが終了したときに終了します。

おすすめ

転載: blog.csdn.net/fangzhan666/article/details/132402433