私は地図を持っています:
_var sessions = map[string] chan int{}
_
_sessions[key]
_を削除するにはどうすればよいですか?私は試した:
_sessions[key] = nil,false;
_
それはうまくいきませんでした。
更新(2011年11月):
マップエントリを削除するための特別な構文は Goバージョン1 で削除されました:
Go 1は特別なマップの割り当てを削除し、新しい組み込み関数を導入します。
delete
:delete(m, x)
は、式_m[x]
_によって取得されたマップエントリを削除します。 ...
奇妙なことに、
package main
func main () {
var sessions = map[string] chan int{};
delete(sessions, "moo");
}
動作するようです。ただし、これはリソースの不適切な使用のようです!
別の方法は、存在を確認し、値自体を使用することです。
package main
func main () {
var sessions = map[string] chan int{};
sessions["moo"] = make (chan int);
_, ok := sessions["moo"];
if ok {
delete(sessions, "moo");
}
}
古い言語では、マップk
からキーk
を持つエントリを削除するために、ステートメントを書きました。
_m[k] = value, false
_
この構文は、2対1の唯一の割り当てである特殊な特殊なケースでした。評価されるが破棄される値(通常は無視される)に加えて、ほぼ常に定数falseであるブール値を渡す必要がありました。それは仕事をしましたが、奇妙で、競合のポイントでした。
Go 1では、その構文はなくなりました。代わりに、新しい組み込み関数delete
があります。呼び出し
_delete(m, k)
_
式_m[k]
_によって取得されたマップエントリを削除します。戻り値はありません。存在しないエントリを削除しても、何もしません。
更新:_go fix
_を実行すると、_m[k] = value, false
_形式の式がdelete(m, k)
に変換されます。無視された値はプログラムから安全に破棄でき、false
は事前定義されたブール定数を参照します。修正ツールは、プログラマーによる検査のために、構文の他の用途にフラグを立てます。
From Effective Go :
マップエントリを削除するには、delete組み込み関数を使用します。この関数の引数は、マップと削除するキーです。キーが既にマップに存在しない場合でも、これを行うのは安全です。
delete(timeZone, "PDT"); // Now on Standard Time
delete(sessions, "anykey")
最近では、何もクラッシュしません。
nil
の代わりにmake (chan int)
を使用します。最初の値は、マップが保持するタイプと同じでなければなりません。
package main
import "fmt"
func main() {
var sessions = map[string] chan int{}
sessions["somekey"] = make(chan int)
fmt.Printf ("%d\n", len(sessions)) // 1
// Remove somekey's value from sessions
delete(sessions, "somekey")
fmt.Printf ("%d\n", len(sessions)) // 0
}
PDATE:私の答えを修正しました。