golangで戻り値が多すぎる問題の対処方法

王林
リリース: 2019-12-24 15:26:05
オリジナル
2731 人が閲覧しました

golangで戻り値が多すぎる問題の対処方法

複数の値を返す

Go (コンパイル言語の場合) の非常に特殊な機能は、関数とメソッドが複数の値を返すことができることです。 (Python と Perl も動作します)。

これを使用すると、C プログラムの多くの悪い規則、つまりパラメーターを変更してエラーを返す (たとえば、EOF に遭遇した場合に -1 を返す) を改善することができます。 Go では、Write はカウント値とエラー「はい、いくつかのバイトを書き込みましたが、デバイス例外のためすべてが書き込まれませんでした。」を返します。

*os パッケージの File.Write は次のように宣言されます:

func (file *File) Write(b []byte) (n int, err error)
ログイン後にコピー

ドキュメントに記載されているように、書き込まれたバイト数を返し、 n != len(b) の場合は、を返します。 nil 以外のエラー。これは Go では一般的なアプローチです。タプルはネイティブ型として表示されないため、複数の戻り値が最適な選択となる可能性があります。特定のエラー信号に対してフィールド空間をオーバーロードすることなく、必要な値を正確に返すことができます。

名前付き戻り値

Go 関数の戻り値または結果パラメーターには、名前を割り当てて、入力パラメーターと同じように元の変数のように使用できます。名前が付けられている場合は、関数の先頭でその型のゼロ値で初期化されます。関数がパラメーターを追加せずに return ステートメントを実行した場合、結果のパラメーターが返されます。この機能を使用すると、(再び) 少ないコードでより多くのことを実行できるようになります。

名前は必須ではありませんが、名前を付けるとコードがより堅牢かつ明確になります。ドキュメントはこちらです。たとえば、int 型の nextPos 戻り値に名前を付けると、どれがどの値を表すかを示すことができます。

func nextInt(b []byte, pos int) (value, nextPos int) { /* ... */ }
ログイン後にコピー

名前付きの結果は初期化され、未変更の戻り値に関連付けられるため、非常に単純かつ明確になります。これは、非常によく使用される io.ReadFull コードの一部です:

func ReadFull(r Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        buf = buf[nr:len(buf)]
    }
    return
}
ログイン後にコピー

推奨される関連記事とチュートリアル: golang チュートリアル

以上がgolangで戻り値が多すぎる問題の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート