Menu
Coddy logo textTech

型アサーション

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 17/68。

インターフェース変数を扱う際、その中に格納されている実際の具体的な値にアクセスする必要がしばしばあります。そこで型アサーション(type assertions)の出番です。これを使えば、基になる値を安全に取り出して使用することができます。

型アサーションはこの構文を使用します:value, ok := interfaceVariable.(Type)。最初の戻り値は指定された型の抽出された値であり、2番目はアサーションが成功したかどうかを示すブール値です。

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

ok 変数は安全性のために非常に重要です。誤った型をアサートしようとすると、okfalse になり、value はその型のゼロ値になります。ok を確認しないと、型アサーションの失敗によりプログラムがパニックを引き起こします。

interface{}型の値を扱う際、型アサーションは不可欠です。これにより、汎用的なインターフェースを特定の型に変換し、そのメソッドや操作を利用できるようになります。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

このチャレンジでは、型アサーションを使用して、インターフェース変数から具象値を安全に抽出して操作する練習をします。空のインターフェースに格納されたさまざまなタイプの値を処理するデータアナライザーを作成します。

2つの入力を受け取ります:

  • チェックするデータ型を表す文字列(例:"int""string"、または "bool"
  • 実際の値を表す文字列(例:"42""hello"、または "true"

あなたのタスクは以下の通りです:

  1. 値の文字列を適切なGoの型に変換し、interface{} 変数に格納します:
    • "int" の場合:整数に変換
    • "string" の場合:文字列として使用
    • "bool" の場合:ブール値に変換
  2. 型アサーションを使用して、インターフェース変数が最初の入力で指定された期待通りの型を含んでいるかチェックします
  3. 型アサーションが成功した場合は、次のように出力します:"Success: [value] is a [type]"
  4. 型アサーションが失敗した場合は、次のように出力します:"Failed: value is not a [type]"

アサーションが成功したかどうかを確認するために、ok 変数を使用した安全な型アサーション構文を使用する必要があります。このチャレンジでは、プログラムをパニックさせることなく、インターフェース変数から具象値を安全に抽出する方法についての理解をテストします。

ブール値の変換については、"true"true に変換し、それ以外の文字列は false に変換する必要があります。文字列から整数への変換には strconv パッケージを使用してください。

チートシート

型アサーションを使用すると、value, ok := interfaceVariable.(Type) という構文を使用して、インターフェース変数から具体的な値を取り出すことができます:

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

ok 変数は、アサーションが成功したかどうかを示します。false の場合、value はその型のゼロ値になります。アサーションの失敗によるパニックを防ぐために、常に ok を確認してください。

自分で試してみよう

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 入力を読み込む
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// インターフェース値を格納するための変数
	var interfaceValue interface{}
	
	// TODO: 以下にコードを記述してください
	// 1. dataTypeに基づいてvalueStrを適切な型に変換し、interfaceValueに格納します
	// 2. 型アサーションを使用して、interfaceValueに期待される型が含まれているか確認します
	// 3. 適切な成功または失敗のメッセージを出力します
	
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン