ホームページ  >  記事  >  バックエンド開発  >  Go で関数の戻り値をスライスできないのはなぜですか?

Go で関数の戻り値をスライスできないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 18:19:02972ブラウズ

Why Can't I Slice the Return Value of a Function in Go?

変数と関数の戻り値の動作の多様性

プログラミングでは、変数と関数の戻り値の動作の違いを理解することが不可欠です。次のコード スニペットを考えてみましょう:

<code class="go">hash := sha1.Sum([]byte(uf.Pwd))
u.Pwhash = hex.EncodeToString(hash[:])</code>

このコードは意図したとおりに機能し、ハッシュ変数にはバイト配列の SHA1 ハッシュが格納され、u.Pwhash 変数にはそのハッシュの 16 進表現が保持されます。

ただし、これら 2 行を 1 つに結合しようとすると、次のエラーが発生します。

<code class="go">u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])</code>

このエラー メッセージは、sha1.Sum() の戻り値をスライスすることが無効であることを示しています。この違いは次の理由で発生します。

  • 変数: ハッシュなどの変数はアドレス指定可能であり、データを保存および取得できるメモリ内の場所を表します。
  • 関数の戻り値: 変数とは異なり、関数呼び出し (sha1.Sum() など) の戻り値はアドレス指定できません。これらは、関数の実行中に作成および破棄される一時的な値です。

2 番目のスニペットでは、sha1.Sum()[:] をスライスしようとしますが、sha1.Sum の戻り値が無効になるため、これは許可されません。 () はアドレス指定できません。スライス操作では、オペランドがアドレス指定可能である必要があります。

したがって、行を正しく結合するには、スライスする前に、まず sha1.Sum() の戻り値をハッシュなどのアドレス指定可能な変数に格納する必要があります。

<code class="go">hash := sha1.Sum([]byte(uf.Pwd))
u.Pwhash = hex.EncodeToString(hash[:])</code>

変数と関数の戻り値のアドレス指定可能性と動作を理解することは、正しく効率的な Go コードを作成するために非常に重要です。

以上がGo で関数の戻り値をスライスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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