配列と関数呼び出しを含むコード行を結合しようとすると、一般的な問題が発生します。たとえば、2 行を正常に結合した次の元のコードについて考えてみましょう:
<code class="go">hash := sha1.Sum([]byte(uf.Pwd)) u.Pwhash = hex.EncodeToString(hash[:])</code>
ただし、コードを 1 行に結合しようとすると、エラー メッセージが表示される可能性があります:
<code class="go">u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])</code>
エラー メッセージは、関数呼び出しの戻り値のスライスに関する問題を示しています。 Go では、sha1.Sum() のような関数呼び出しの戻り値はアドレス指定できません。
この動作を理解するには、Go でアドレス可能な型が何であるかを知ることが重要です。 Go 仕様によれば、次のものだけがアドレス指定可能です:
sha1.Sum() の戻り値はこれらの型のいずれでもないため、スライスできません。ここで必要なように配列をスライスするには、配列がアドレス指定可能である必要があります。
元のコードの最初の行では、返された配列はアドレス指定可能なローカル変数 (ハッシュ) に格納されます。 2 行目では、hex.EncodeToString(hash[:]) が計算され、意図したとおりに動作します。
変数と戻り値のこの区別は、Go のアドレス指定ルールを理解することの重要性を強調しています。これらのルールに従うことで、一般的なエラーを回避し、より堅牢なコードを作成できます。
以上がGo で関数の戻り値をスライスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。