追記
@hisaichi5518 map操作はgoroutine safeじゃないので複数goroutineから呼ぶ場合はlockが必要なのと、""代入だと存在しないのか空文字が入ってるのか区別できないのでdeleteで消す(Perlと一緒)のがいりそう
— fujiwara (@fujiwara) 2014, 8月 23
@hisaichi5518 エラーも返ってくるとgoっぽいと思いました!キャッシュ消えたときとかハンドリングしやすそうかなと
— Taichi Nakashima (@deeeet) 2014, 8月 23
有益な情報を多数得た(ありがとうございます!)ので、以下の変更を加えてみた。
- Get, Delete, GetOrSetで値以外にもboolを返すようにした。
- Getは値を持っていたらtrue, 持ってなかったらfalse
- Deleteは削除したらtrue, しなかったらfalse
- GetOrSetは値を持っていたらtrue, 持っておらずSetしたらfalseを返すようにした
- http://blog.golang.org/go-maps-in-action
- delete(map, key)を使うようにした
- RWMutexを使ってロックするようにしてみた。
https://github.com/hisaichi5518/vache
めっちゃ勉強になった。
追記終わり。
vache
Golang〜〜
指定した秒数経つとキャッシュが消えるというのをGoだけでやりたかったのでモジュールにした。
みんなだいすきPerlにはそういうモジュールがある。
https://metacpan.org/release/Cache-Scalar-WithExpiry
vacheという可愛い名前です。
https://github.com/hisaichi5518/vache
使い方
package main import ( "log" "time" "github.com/hisaichi5518/vache" ) func main() { vache.Set("key", "val", time.Second) // 1秒後に消えると指定 v, ok := vache.Get("key") log.Println(v) //=> 2014/08/23 19:58:22 val log.Println(ok) //=> 2014/08/23 19:58:22 true time.Sleep(2 * time.Second) // キャッシュを消すため、2秒スリープ v, ok = vache.Get("key") if !ok { v = "not found" // 消えてたらnot foundになるようにする } log.Println(v) //=> 2014/08/23 19:58:24 not found <= 消えてる! log.Println(ok) //=> 2014/08/23 19:58:24 false <= 消えてる! }
実装について
time.AfterFuncを使えば、何秒後にほげほげするとか出来るので、それを使った。
http://golang.org/pkg/time/#AfterFunc
ツッコミお待ちしております。