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