次の構造体があるとします。
type Person struct {
name string
age int
}
その構造のオブジェクトを作成する場合
person1 := Person{name: "Name", age: 69}
このオブジェクトをnilに設定した場合
person1 = nil
動作しません。実際、型の割り当てエラーですが、マップとスライスでは動作します。それでは、オブジェクトを削除する方法はありますか? delete builtinのドキュメントを見ましたが、指定されたマップからエントリを削除します。ありがとう。
Goはガベージコレクションされた言語です。想定されていないため、メモリからオブジェクトを削除することはできません。ガベージコレクターのdutyおよびresponsibilityであり、それこれは、自動的に行います。ガベージコレクターは、到達不能になったオブジェクトをメモリから適切に削除します。
nil
はこれらのタイプの有効な値( ゼロ値 )であるため、マップとスライスにnil
を割り当てることができます。 struct
タイプのゼロ値はnil
ではなく、すべてのフィールドにゼロ値があるstruct
値です。
構造体の値をクリアまたは上書きする場合は、単純に assign 別の構造体の値、できればゼロ値(空の構造体)を使用します。
person1 := Person{name: "Name", age: 69}
// work with person1
// Clear person1:
person1 = Person{}
ただし、これはperson1
によって割り当てられたメモリを解放しないことに注意してください。前に書いたように、GCは到達不能になると自動的に解放されます。
nil
は、ポインター型の有効な値(ゼロ値)でもあるため、person1
がPerson
(つまり、*Person
)へのポインターになる場合、 nil
を割り当てることもできます。例:
person1 := &Person{name: "Name", age: 69}
// work with person1
// Clear person1:
person1 = nil
ポインタをnil
に設定してクリアすると、ポイントされたオブジェクトが再びGCによって処理されます。
ガベージコレクターの動作の詳細については、「 Golang-bytes.Bufferで占有されたメモリを解放できない 」を参照してください。
Nilを設定する場合は、値の代わりにポインターを使用します。
person1 := &Person{name: "Name", age: 69}
// Then you can set
person1 = nil