ホームページ  >  記事  >  バックエンド開発  >  golang関数のエラーハンドリングトラップ

golang関数のエラーハンドリングトラップ

王林
王林オリジナル
2024-05-01 12:18:01685ブラウズ

Go で関数エラーを処理する場合、4 つの落とし穴があります。1) 空のインターフェイスを使用してエラーを返す、2) 評価が遅延してコンテキストが失われる、3) デフォルトで値によるエラーを受け入れる、4) 不正な位置合わせ。これらの落とし穴を理解すると、エラーを処理する堅牢で明確な Go コードを作成するのに役立ちます。

golang関数のエラーハンドリングトラップ

#Go における関数のエラー処理トラップ

Go では、エラー処理は非常に重要であり、関数のエラー処理には多くのトラップが用意されています。あなたを驚かせるかもしれません。したがって、エラー処理の微妙な違いを深く理解することが重要です。

1. 関数の種類: 空のインターフェイス

Go 関数は、多くの場合、

error 型の空のインターフェイス interface{} を返します。これは、nil を返すことも、任意のタイプのエラー値を返すこともできることを意味します。ただし、nil と実際のエラーを区別できないため、混乱が生じる可能性があります。

実践例:

func Example(input int) (interface{}, error) {
    if input < 0 {
        return nil, errors.New("input must be non-negative")
    }
    return input * 2, nil
}

空のインターフェイスを使用する代わりに、明確なエラー タイプを返す方が良いでしょう。

2. 評価の遅延

Go で返されるエラーにより評価が遅れます。これは、エラーがアクセスされる前に関数本体の実行が完了したことを意味します。 error にアクセスするまでにコンテキストが失われている可能性があるため、問題が発生する可能性があります。

実践例:

func Example(input int) error {
    var err error
    if input < 0 {
        err = errors.New("input must be non-negative")
    }

    if err != nil { 
        return err 
    }

    return nil 
}

この場合、

input が 0 未満の場合、Examplenil を返します。 err にアクセスする前に return ステートメントが実行されるため、エラーが発生します。

3. 値の受信

デフォルトでは、エラー パラメータは値で受信されます。これは、エラー値が割り当てられると、エラーのコピーが作成されることを意味します。これは、特に多数のエラーを処理する場合にコストがかかる可能性があります。

実践的な例:

func Example(input int) error {
    err := errors.New("input must be non-negative") // 创建一个 error 副本
    if input < 0 {
        return err 
    }
    
    return nil 
}

ポインターを使用してエラーを受信すると、この状況を回避できます:

func Example(input int) error {
    var err *error // 使用指针接收 error

    if input < 0 {
        err = new(error)
        *err = errors.New("input must be non-negative")
    }

    return *err 
}

4. エラーの位置合わせ

関数が複数の戻り値で宣言されている場合、エラーは常に最後に返される値である必要があります。 Go コンパイラはエラーを調整するため、この規則に従わない場合、予期しない結果が発生する可能性があります。

実際の例:

func Example(input int) (bool, error) {
    if input < 0 {
        return false, errors.New("input must be non-negative")
    }
    return true, nil 
}

エラーが最後の戻り値ではない場合、確実に位置合わせを行うために追加のコード処理が必要です。

これらの落とし穴を理解することで、エラーを処理する、より堅牢で明確な Go コードを作成できます。

以上がgolang関数のエラーハンドリングトラップの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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