🐱

Goの型変換とアサーションの違い

2023/07/04に公開

Go言語では、型変換とアサーションという二つの方法で、変数の型を変更したり、別の型として扱ったりすることができます。
しかし、これらの方法はどのように使い分けるべきなのでしょうか?この記事では、型変換とアサーションの違いと使い方について説明します。

型変換とは

型変換とは、ある型の値を別の型に変換することです。例えば、int型の値をfloat64型に変換する場合は、以下のように書きます。

go
var i int = 10
var f float64 = float64(i) // 型変換
fmt.Println(f) // 10.0

型変換は、基本的には同じ種類の型(数値、文字列、ブールなど)間で行えます。異なる種類の型間で型変換する場合は、一般的にはパッケージや関数を使って行います。例えば、文字列を数値に変換する場合は、strconvパッケージのAtoi関数やParseInt関数などを使います。

var s string = "42"
var i int
i, err := strconv.Atoi(s) // 文字列をintに変換
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println(i) // 42
}

アサーションとは

アサーションとは、インターフェース型の値が実際にはどの具体的な型を持っているかを確認したり、その具体的な型として扱ったりすることです。例えば、interface{}型の値がstring型であるかどうかを確認する場合は、以下のように書きます。

var x interface{} = "Hello"
s, ok := x.(string) // アサーション
if ok {
    fmt.Println(s) // Hello
} else {
    fmt.Println("x is not a string")
}

アサーションは、インターフェース型から具体的な型への操作です。具体的な型からインターフェース型への操作は、暗黙的に行われます。例えば、string型の値をinterface{}型に代入する場合は、以下のように書きます。

var s string = "Hello"
var x interface{} = s // 暗黙的なインターフェース実装
fmt.Println(x) // Hello

まとめ

Go言語では、型変換とアサーションという二つの方法で、変数の型を変更したり、別の型として扱ったりすることができます。
しかし、これらの方法は異なる目的や条件で使われます。

  • 型変換は、同じ種類の型やパッケージや関数を使って異なる種類の型に変換すること
  • アサーションは、インターフェース型から具体的な型に確認したり扱ったりすること
  • 型変換は明示的に行われますが、アサーションは暗黙的に行われる場合もある

Discussion