ホームページ >バックエンド開発 >Golang >変数を再割り当てするときに動的タイプがクリアされません - これはバグですか?

変数を再割り当てするときに動的タイプがクリアされません - これはバグですか?

PHPz
PHPz転載
2024-02-13 16:00:11500ブラウズ

重新分配变量时动态类型未清除 - 这是一个错误吗?

php エディター Xiaoxin は、よくある質問に答えます。「変数を再割り当てするときに動的型がクリアされません。これはバグですか?」PHP では、変数の動的型付けは重要な機能です。その柔軟性。別のタイプの値を変数に再割り当てすると、PHP は新しい値に従って変数のタイプを自動的に調整します。ただし、変数をクリアするのを忘れて予期しない結果が生じる場合があります。では、この状況は間違いとみなされるのでしょうか?一緒に調べてみましょう。

質問内容

Goにはnil値を保持するインターフェースがnilに等しくないというよく知られた癖があります。これは、内部的にはインターフェイスが動的型と値の組み合わせであり、両方が nil の場合にのみ nil になるためです。つまり、 (*MyStruct)(nil) != nil ですが、 (nil)(nil) == nil となります。このブログではそれについて詳しく説明しています。

この動作に関連する驚くべき内容をここで見つけました: https://goplay.tools/snippet/VF8oWt9XvO8。コードも以下にコピーされます。

動的型が割り当てられた変数を再割り当てすると、動的型が記憶され、新しい値として保持されるようです。これは私にとって予想外のようで、変数を再割り当てすると過去の状態がすべて上書きされるはずだと思っていました。

言語仕様を確認しましたが、少し曖昧です: https://go.dev/ref/spec#Assignability

リーリー

これが値のみを意味するのか、値と動的型を意味するのかは不明です。

この動作は言語で意図的なものですか、それともすべての状態をクリアせずに変数の再割り当てのためにランタイムがメモリを再利用することによる副作用でしょうか?

コード:

<code>
Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block ... Redeclaration does not introduce a new variable; it just assigns a new value to the original.
</code>

解決策

あなたの「予期せぬ」部分は次のとおりです:

リーリー

結果は nil になると予想されます。 err はインターフェイス型 (error) の変数であり、FuncThatReturnsCustomError() の戻り型は *CustomError です。これはインターフェイス型ではなく、具象型 (CustomError へのポインタ) です。非インターフェイス値を返すため、インターフェイス型の変数に代入する場合はインターフェイス値にラップする必要があります。ここで、#nil 以外のインターフェイス値が作成されます。これは、古いタイプの情報を「記憶」または「保存」することとは何の関係もありません。

次のインターフェイス結果タイプの関数を使用する場合:

リーリー

そしてテストしてください:

リーリー

得られるもの (

Go Playground で試してください): リーリー

returnNilErr()

にはすでにインターフェイスの結果型 (error) があるため、その戻り値をインターフェイス値にパッケージ化して err に割り当てる必要はありません。 変数はそのまま使用できます。 関連/重複の可能性があるものを参照してください: p>Go がここで失敗する理由を理解するには、nil 値を非表示にしてください

Go FAQ: nil エラー値が nil に等しくないのはなぜですか?

以上が変数を再割り当てするときに動的タイプがクリアされません - これはバグですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。