goroutineでファイルを保存してファイル名を返す。Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。登録してこのコミュニティに参加するどなたでも質問していただけますどなたでも回答していただけます最もよい回答には賛成票が入り、最上位に上がりますホーム質問タグユーザーgoroutineでファイルを保存してファイル名を返す。123件0ファイルを保存してそのファイル名をチャンネルを使って返すようなプログラムを書いています。以下のような関数です。fnameChのように呼び出します。urlからデータを取得してそれをファイルに保存します。ファイル名が重複する可能性があるので保存時にMutexを使ってロックしています。保存が終わったらfnameChを通してファイル名を返します。ファイル保存処理の概要は下記のとおりです。fnameこれだとdeferで指定した関数が呼ばれる前にmain関数が終わった場合deferで指定した関数が呼ばれずにプログラムが終わってしまいます。ファイルクローズやロックの開放がされずに終わってしまいます。[ファイル名]}という関数を作って、チャンネルへの入力をdeferで指定すれば良いのですが、deferは最後に宣言された関数から呼び出されるので必然的にファイル名を返すdeferはファイルをクローズするdeferやロックを開放するdeferよりも前に宣言する必要があります。引数はdefer宣言時のものに固定されてしまうので、ファイル書き込み時にエラーが出てしまった場合、エラーでファイル保存に失敗しているのにファイル名が返される状況になってしまいます。3番目に呼び出される。2番めに呼び出される。確実にファイルを閉じたりロックをアンロックしたりするようにはできますか。票0多分自己解決しました。ファイルのオープンを行う関数を別で定義してそこでロック、ファイル開閉を行い、その関数内でdeferするようにしました。することでその関数から戻るときにロック解除とファイルのクローズが行われるので確実にチャンネルへの入力が最後になると思います。発生したときに実行されます。実行せずにプログラムが終了してしまうので、そのケースのことをご質問されたとのかと思いました。実行されない場合のサンプルコードを書きます。os.Exit(0)}実行結果は、このようになります。個の銅バッジプログラムが終了した時にもdeferは呼ばれることを忘れていました。放っておいても大丈夫みたいですね。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。4Goroutineを使うと性能が落ちるのはなぜか0packageが適用される範囲は1ファイルですか?1Goの「ファイル名」と「パッケージ名」について1Go言語でgoroutineを利用したstructの要素更新1変数の値がgoroutine間で同じになってしまう。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。