web-dev-qa-db-ja.com

Goでstructオブジェクトを削除する方法は?

次の構造体があるとします。

type Person struct {
    name string
    age  int
}

その構造のオブジェクトを作成する場合

person1 := Person{name: "Name", age: 69}

このオブジェクトをnilに設定した場合

person1 = nil

動作しません。実際、型の割り当てエラーですが、マップとスライスでは動作します。それでは、オブジェクトを削除する方法はありますか? delete builtinのドキュメントを見ましたが、指定されたマップからエントリを削除します。ありがとう。

16
redpix_

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は、ポインター型の有効な値(ゼロ値)でもあるため、person1Person(つまり、*Person)へのポインターになる場合、 nilを割り当てることもできます。例:

person1 := &Person{name: "Name", age: 69}
// work with person1

// Clear person1:
person1 = nil

ポインタをnilに設定してクリアすると、ポイントされたオブジェクトが再びGCによって処理されます。

ガベージコレクターの動作の詳細については、「 Golang-bytes.Bufferで占有されたメモリを解放できない 」を参照してください。

30
icza

Nilを設定する場合は、値の代わりにポインターを使用します。

person1 := &Person{name: "Name", age: 69}
// Then you can set
person1 = nil
4
sadlil