回答:
不思議なことに、
package main
func main () {
var sessions = map[string] chan int{};
delete(sessions, "moo");
}
動作するようです。ただし、これはリソースの使用が不十分なようです!
もう1つの方法は、存在を確認し、値自体を使用することです。
package main
func main () {
var sessions = map[string] chan int{};
sessions["moo"] = make (chan int);
_, ok := sessions["moo"];
if ok {
delete(sessions, "moo");
}
}
古い言語では、でk
表されるマップからキーを持つエントリを削除するためにm
、ステートメントを書きました、
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
事前定義ブール定数を指します。修正ツールは、プログラマーによる検査のために構文の他の使用にフラグを立てます。
効果的なGoから:
マップエントリを削除するには、削除する組み込みの関数を使用します。この関数の引数は、マップと削除するキーです。キーがすでにマップに存在しない場合でも、これを実行しても安全です。
delete(timeZone, "PDT") // Now on Standard Time
assignment count mismatch: 1 = 2 (use delete)
delete(sessions, "anykey")
最近では、何もクラッシュしません。
のmake (chan int)
代わりに使用しますnil
。最初の値は、マップが保持しているものと同じタイプでなければなりません。
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
}
更新:私の答えを修正しました。
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
sessions["moo"] = sessions["moo"], false;