logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

Golang ノート — タイプアサーション

作成者:カランカラン2019年3月29日 9:00
ホーム/開発ノート
💡

質問やフィードバックがありましたら、フォームからお願いします

英語原文

目次

    本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

    以下は、指定されたルールに従って翻訳した日本語のテキストです。


    golang において、interface{} 型に対して型判定を行うことで、このインターフェースが特定の型であると仮定することができ、そうすることでその型のメソッドを操作することが可能になります。

    var i interface{} = "hello"
    s := i.(string)
    fmt.Println(s)

    このコードは、元の interface{} を文字列として判定します。

    ただし、特に注意が必要なのは、もしこの型が文字列でない場合、このコードは直接 panic を引き起こします。

    args := []interface{}{
    		1,
    		"1",
    		"2",
    	}
    for _, arg := range args {
      val := arg.(int) // interface conversion: interface {} is string, not int
      fmt.Println(val)
    }

    Golang は、型判定の際に二つの値を返すメカニズムを提供しています。一つは変換後の値、もう一つはこの判定が正しいかどうかです。

    args := []interface{}{
    		1,
    		"1",
    		"2",
    	}
    for _, arg := range args {
      if val, ok := arg.(int); ok {
        fmt.Println(val)    
      } else {
        fmt.Println("not int.")
      }
    }

    ここまでで、注意すべき点が二つあります:

    1. 第二の返り値がない場合、型が確実でない限り、型判定の失敗が原因で panic を引き起こす可能性があります。
    2. 第二の返り値を追加することで、panic を引き起こすことはありません。

    少々手間ではありますが、型変換は常に保守的に行う方が良いでしょう。

    もう一つ注意すべき点は、判定が失敗した場合の val は、判定された型のゼロ値であるということです。

    判定失敗後の val は、判定された型のゼロ値です。

    for _, arg := range args {
      if val, ok := arg.(int); ok {
        fmt.Println(val, ok) // 1, true
      } else {
        fmt.Println(val, ok) // 0 , false
        // 0, false
      }
    }

    一般的に、判定が失敗した後、この値を使用することはあまりありませんが、注意しないと罠にはまる可能性があります。

    ← Goworker 入門 — Redis によるワーカーの実装golangアプリでログを収集して一元化する方法 →

    この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

    ☕Buy me a coffee