runを実行するものを作っていた。詳しい話はアドベントカレンダーに記事を書いた。PoC的なものだったのでまじめには作っていなかったのだけれど意外と便利なので常用してみようとした。そのときに1つだけ困ったことがあったのでそれへの対応のメモ。現状の処理では以下の様にファイルを一時的に書き換えている。runで実行した長めの処理の途中で中断したいことがある。cなどでsignal(SIGINT)が送られたら即座に終了してしまう(挙動としては正しい)。rollbackは単にdeferで付けているだけなので当然ファイルは書き換わった状態のまま残る。この処理中でSIGINTならrollbackが呼ばれないsignalを受け取る方法os/signalを使う。signal.Notifyでdefaultのhandlerから挙動を変えている(defaultはpanic)。<pid>が必要になる自体は避けたい)。これにはsignal.Stopを使えば良さそう。そんなわけで以下のようなサンプルコードを作ってみる。となり0で終了されるはず。加えて、SIGINTが送られてもrollbackされるようにする。実行結果だけを先に転記しておく。上手く動いていそうに見える。rollback()}rollbackが複数回呼ばれてしまうことがあるちょっとした問題がある。rollbackが複数回呼ばれることがある模様。cを一度だけ入力させrollbackさせたのちに何もせずに正常終了という形になった場合にはrollbackが2度呼ばれてしまう。-1これはsync.Onceで雑に対応してしまえば良さそう。os.Signal)今度は大丈夫。0おわりに無事に本体自体も修正された。fmt.Println("end")}以下に変更されている(今まではこれが残っていた)。objectの作成にinterfaceの埋め込みを使う過去の以下の記事の続き。何も考えずにgoimportsで補完された結果のコードを残しておいた...2018-04-08go言語でASTの解析にgo/typesの機能を使うことの威力についてgoはASTの解析が手軽なのが便利。(個人的なコード生成のための環境を作っている。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。