型アサーション (Type Assertion) は、インターフェイスの型変数が保持する値が目的のインターフェイスまたは特定の型を実装しているかどうかを確認するために、インターフェイスの値に対して使用される操作です。

 

Go 言語の型アサーションの構文形式は次のとおりです。

value, ok := x.(T)

このうち、x はインターフェースのタイプを表し、T は特定のタイプを表します (インターフェースのタイプである場合もあります)。

このアサーション式は、x の値 (つまり、value) とブール値 (つまり、ok) を返します。これらは、x が T 型であるかどうかを判断するために使用できます。

  • T が具象型の場合、型アサーションは x の動的型が具象型 T と等しいかどうかをチェックします。チェックが成功した場合、型アサーションによって返される結果は、型が T である x の動的値です。
  • T がインターフェイス型の場合、型アサーションは x の動的型が T を満たすかどうかをチェックします。チェックが成功した場合、x の動的値は抽出されず、戻り値は型 T のインターフェイス値になります。
  • T の型に関係なく、x が nil インターフェイス値の場合、型アサーションは失敗します。

サンプルコードは次のとおりです。

 package main

import (
    "fmt"
)

func main() {
    var x interface{}
    x = 10
    value, ok := x.(int)
    fmt.Print(value, ",", ok)
} 

操作の結果は次のようになります。

10,true

2 番目のパラメーターが受信されない場合 (上記のコードでは問題ありません)、アサーションが失敗したときに直接パニックが発生することに注意してください。 x が nil の場合もパニックになります。

サンプルコードは次のとおりです。

 package main

import (
    "fmt"
)

func main() {
    var x interface{}
    x = "こんにちは"
    value := x.(int)
    fmt.Println(value)
} 

操作の結果は次のようになります。

panic: interface conversion: interface {} is string, not int

型アサーションはスイッチでも使用できます。サンプルコードは次のとおりです。

package main

import (
    "fmt"
)

func main() {
    var a int
    a = 10
    getType(a)
}

func getType(a interface{}) {
    switch a.(type) {
    case int:
        fmt.Println("aの型はintです")
    case string:
        fmt.Println("aの型はstringです")
    case float64:
        fmt.Println("aの型はfloatです")
    default:
        fmt.Println("未知の型です")
    }
} 

操作の結果は次のようになります。

aの型はintです

 

「 Go 言語の型アサーションの簡単な紹介」についてわかりやすく解説!絶対に観るべきベスト2動画

【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
【Go言語 超入門コース】14.メソッド|Goのメソッドは、他の言語のメソッドとは違っています【プログラミング初心者向け入門講座】

Share via
Copy link