ホームページ  >  記事  >  バックエンド開発  >  golang エラー:「範囲内で x (y 型) を z 型として使用できません...」どうすれば解決できますか?

golang エラー:「範囲内で x (y 型) を z 型として使用できません...」どうすれば解決できますか?

WBOY
WBOYオリジナル
2023-06-25 15:47:551081ブラウズ

Golang では、range ステートメントは、配列、スライス、文字列、マップなどのデータ構造を横断する便利な方法です。ただし、range ステートメントを使用すると、「x (y 型) を range の z 型として使用できません...」という一般的なエラーが発生することがあります。この記事では、このエラーの原因とその解決方法を紹介することを目的としています。

  1. エラーの原因

このエラーの理由は、range ステートメントを使用するときに、トラバースされる変数の型が、ステートメントで予期される型と一致しないことです。範囲。具体的には、このエラーは通常、次の 2 つの状況で発生します。

ケース 1: トラバースされている変数が不正な範囲関数を実装している

たとえば、myVar という名前の変数を定義します。文字列型の変数です。 、そして range を使用すると、この文字列は range 関数を実装していないため、上記のエラーが発生します。

var myVar string = "Hello, World!"

for index, value := range myVar {
    fmt.Println(index, string(value))
}

ケース 2: トラバースされている変数の型が range で予期される型と一致しません

たとえば、 myVar という名前の変数を型 []int で定義し、 range を使用します。各ループ反復で int 型の値にアクセスすることを期待します。

var myVar []int = []int{1, 2, 3, 4, 5}

for _, value := range myVar {
    fmt.Println(string(value)) // 报错:cannot use value (type int) as type string in argument to string
}

別の例として、interface{} 型の myVar という名前の変数を定義し、range を使用する場合、各ループ反復で string 型の値にアクセスすることを想定している場合、上記のエラーも発生します。が発生します。

var myVar interface{} = []string{"Hello", "World"}

for _, value := range myVar {
    fmt.Println(value.(int)) // 报错:cannot use value (type string) as type int in argument to .(int)
}
  1. 解決策

この問題を解決する方法は、主に上記 2 つの状況に基づいて区別することです。具体的には、この問題を解決するには次の手順を実行できます。

ステップ 1: トラバースされた変数が範囲関数を実装しているかどうかを確認します

ケース 1 の場合は、範囲関数が実装されているかどうかを確認する必要があります。 traversed 変数が range 関数を実装しているかどうか。実装されていない場合は、range ステートメントの要件に準拠するように変換する必要があります。

たとえば、上の例では、myVar のタイプを []rune に変更できるため、range ステートメントを使用して文字列を走査できるようになります。

var myVar []rune = []rune("Hello, World!")

for index, value := range myVar {
    fmt.Println(index, string(value))
}

ステップ 2: トラバースされた変数を正しい型に変換する

ケース 2 の場合、期待される範囲の型 Require に準拠するために、トラバースされた変数を正しい型に変換する必要があります。

たとえば、上記の例では、各要素に正しくアクセスできるように、fmt.Println(value.(int)) の int を string に置き換える必要があります。

var myVar interface{} = []string{"Hello", "World"}

for _, value := range myVar.([]string) {
    fmt.Println(value)
}

ステップ 3: アサーションを使用して変数の型が正しいことを確認する

range ステートメントを使用するときにトラバースされる変数の特定の型がわからない場合は、アサーションを使用して変数の型が正しいことを確認できます。変数の型の正確さ。たとえば、次の例では、反復される変数に対してアサーション演算子を使用します。

func printValues(values interface{}) {
    switch v := values.(type) {
        case []string:
            for _, value := range v {
                fmt.Println(value)
            }
        case []int:
            for _, value := range v {
                fmt.Println(value)
            }
    }
}

要するに、このエラーの理由は、range ステートメントを使用するときに、トラバースされる変数の型が、その範囲で予期される型と一致しないことです。この問題は、反復変数が range 関数を実装しているかどうかを確認し、反復変数を正しい型に変換し、アサーションを使用して変数型の正確性を確認することで解決できます。

以上がgolang エラー:「範囲内で x (y 型) を z 型として使用できません...」どうすれば解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。