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

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

DDD
DDDオリジナル
2024-10-24 18:25:33650ブラウズ

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

Go の変数と戻り値の動作を理解する

配列と関数呼び出しを含むコード行を結合しようとすると、一般的な問題が発生します。たとえば、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 サイトの他の関連記事を参照してください。

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