ホーム プログラミング言語 golang golang interface Go言語の型分岐(空のインターフェースで変数の型をスイッチが判断)
 
 
型切り替えフロー制御の構文は、おそらく Go で最も奇妙な構文です。これは、型アサーションの拡張バージョンとみなすことができます。これは、スイッチケースのフロー制御ブロックに似ています。タイプスイッチ フロー制御コード ブロックの構文は次のとおりです。

 

 switch t := areaIntf.(type) {
case *Square:
    fmt.Printf("Type Square %T with value %v\n", t, t)
case *Circle:
    fmt.Printf("Type Circle %T with value %v\n", t, t)
case nil:
    fmt.Printf("nil値:チェックするものは何もありませんか?\n")
default:
    fmt.Printf("予期しないタイプ%T\n", t)
} 

出力構造は次のとおりです。

Type Square *main.Square with value &{5}

変数 t は、areaIntf の値と型を取得します。case ステートメントにリストされているすべての型 (nil を除く) は、対応するインターフェイスを実装する必要があります。検出された型が case ステートメントにリストされていない場合は、default ステートメントが実行されます。

case キーワードに続くエントリが非インターフェイス型 (型名または型リテラルで示される) の場合、この非インターフェイス型は述語値 x の (インターフェイス) 型を実装する必要があります。

型アサーションの記述形式

switchが型分岐を実装する場合の記述形式は以下のとおりです。

 switch インターフェイス変数.(type) {
    case タイプ1:
        // 変数がタイプ1の場合の処理
    case タイプ2:
        // 変数がタイプ2の場合の処理
    …
    default:
        // 変数が列挙されたすべてのケースのタイプではない場合の処理
} 

各部の説明:

  • インターフェース変数: 判定が必要なインターフェースの種類の変数を示します。
  • タイプ 1、タイプ 2…: インターフェイス変数の可能なタイプのリストを示し、それらが満たされると、ケースに対応する分岐が処理のために指定されます。

型ブランチを使用して基本型を決定する

次の例では、interface{} 型のパラメータを printType() 関数に渡し、switch を通じて v の型を判断し、対応する型のプロンプトを出力します。コードは次のとおりです。

package main

import (
    "fmt"
)

func printType(v interface{}) {

    switch v.(type) {
    case int:
        fmt.Println(v, "はintです")
    case string:
        fmt.Println(v, "は文字列です")
    case bool:
        fmt.Println(v, "はboolです")
    }
}

func main() {
    printType(1024)
    printType("pig")
    printType(true)
} 

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

1024 はintです
pig は文字列です
true はboolです

コードの 9 行目の v.(type) は、型ブランチを記述する一般的な方法です。この書き方により、スイッチのそれぞれの場合に様々な種類の分岐が書かれることになります。

コードがスイッチを通過すると、v のインターフェースの特定のタイプを判断して、タイプ分岐ジャンプを実行します。{}

スイッチのデフォルトを使用することもでき、機能は他のスイッチと同じです。

type ブランチを使用してインターフェイスのタイプを決定します

複数のインターフェイスで型アサーションを実行する場合、型ブランチを使用して判定プロセスを簡素化できます。

現在、電子決済は徐々に普及しており、現金決済と比較して多くの利点があります。例えば、電子決済は顔認証で支払えますが、現金決済は盗難されやすいです。タイプ ブランチを使用すると、支払い方法にどの機能があるかを簡単に判断できます。詳細については、次のコードを参照してください。

電子決済と現金決済:

package main

import "fmt"

// エレクトロニックペイメント方式
type Alipay struct {
}

// AlipayにCanUseFaceID()メソッドを追加して、刷り込みに対応していることを示す
func(a * Alipay)CanUseFaceID(){
}

// 現金支払いの方法
type Cash struct {
}

// CashにStolen()メソッドを追加して、現金支払いの方法は盗難が発生する場合があることを示します。
func(a * Cash)Stolen(){
}

//刷り込みが可能な特性を持つインターフェース
type CantainCanUseFaceID interface {
    CanUseFaceID()
}

//盗まれやすい特性を持つインターフェース
type ContainStolen interface {
    Stolen()
}

//支払い方法の特徴を印刷する
func print(payMethod interface {}) {
    switch payMethod.(type){
    case CantainCanUseFaceID: //刷り込み可能
        fmt.Printf("% T can use faceid \ n"、payMethod)
    case ContainStolen: //盗まれやすい
        fmt.Printf("% T may be stolen \ n"、payMethod)
    }
}

func main(){

    //エレクトロニックペイメントを使用して判断する
    print(new(Alipay))

    //キャッシュを使用して判断する
    print(new(Cash))
} 

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

  • 6 行目から 19 行目は、それぞれ Alipay と Cash の構造を定義し、独自の特性を持つメソッドを追加します。
  • 22 行目から 29 行目では、顔認識と盗難という 2 つの機能を定義しています。
  • 行 32、支払い方法を渡すためのインターフェイス。
  • 33 行目では、タイプブランチを使用して支払い方法の特性を判断しています。
  • 34行目から37行目はそれぞれ筆面と盗字の特徴を印刷しています。

コードを実行すると、出力は次のようになります。

*main.Alipay can use faceid
*main.Cash may be stolen

 

「 Go言語の型分岐(空のインターフェースで変数の型をスイッチが判断)」についてわかりやすく解説!絶対に観るべきベスト2動画

【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
【Go言語 超入門コース】06.変数 |変数は、例えるなら「箱」のこと。箱にデータを入れておくことができます【プログラミング初心者向け入門講座】

Share via
Copy link