関数内の変数と戻り値の動作の違い
Go で関数を利用する場合、変数と戻り値の違いを理解することが重要です
元のコードとエラー
次のコード スニペットを考えてみましょう。
<code class="go">hash := sha1.Sum([]byte(uf.Pwd)) u.Pwhash = hex.EncodeToString(hash[:])</code>
このコードは次のように機能します。期待される。ただし、2 つの行
<code class="go">u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])</code>
を結合しようとすると、次のエラーが発生します:
models/models.go:104: invalid operation sha1.Sum(([]byte)(uf.Pwd))[:] (slice of unaddressable value)
Reason for Error
このエラーは、結合された行で関数 sha1.Sum() の戻り値を直接スライスしようとしているために発生します。
<code class="go">sha1.Sum(([]byte)(uf.Pwd))[:]</code>
Go の関数の戻り値はアドレス指定できません。言語仕様によれば、アドレス指定可能な値には、変数、ポインター間接指定、スライスのインデックス付け操作、アドレス指定可能な構造体のフィールド セレクター、アドレス指定可能な配列の配列インデックス付け操作、および例外として複合リテラルが含まれます。配列をスライスするには、配列がアドレス指定可能である必要があります。
解決策
最初に sha1.Sum() の戻り値をローカル変数に代入するため、元のコードは機能します。 (ハッシュ)、これにより配列がアドレス指定可能になり、スライスの対象になります。したがって、このようなエラーを回避し、アドレス指定可能性を確保するために、操作を実行する前に戻り値を変数に格納することが一般的に推奨されます。
以上が**Go で関数の戻り値をスライスできないのはなぜですか?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。