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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-25 02:45:30111ブラウズ

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

変数と関数の戻り値の動作の違いを理解する

提供されたコードでは、次の 2 行のコードを結合することを目的としています。特定の操作を実行します。ただし、2 回目の試行ではエラーが発生します。

2 番目のケースでエラーが発生

エラー メッセージ「models/models.go:104: 無効な操作 sha1. Sum(([]byte)(uf.Pwd))[:] (アドレス指定できない値のスライス)" は、2 番目のケースのスライスに問題があることを示唆しています。具体的には、関数呼び出し sha1.Sum() の戻り値をスライスしようとすることが問題の原因です。

問題の理由

Go の関数の戻り値は次のとおりです。アドレス指定可能ではありません。つまり、アドレス指定が必要な操作のオペランドとして使用できません。この場合、配列をスライスするには、配列がアドレス指定可能である必要があります。

関数の戻り値

Go では次のエンティティのみがアドレス指定可能です:

  • 変数
  • ポインタ間接化
  • スライスインデックス操作
  • アドレス指定可能な構造体のフィールドセレクター
  • アドレス指定可能な配列の配列インデックス操作

解決策と最初のケース

最初のケースは、sha1.Sum() の戻り値が最初にアドレス指定可能なローカル変数 (ハッシュ) に格納されるため、正しく機能します。このローカル変数は、スライスなどの後続の操作で使用できます。

結論

2 番目のケースで発生したようなエラーを回避するには、次のことを理解することが重要です。 Go のアドレス可能性ルール。関数の戻り値はアドレス指定可能ではなく、スライスには配列オペランドがアドレス指定可能である必要があります。

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

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