There are instance where defer does not work when checking for/with keyboard exit signals
- with
signalfunc
usage withdefer func
, signalfunc
usage withgo func
,defer signalfunc
in any waygo func
ordefer func
- [
defer signalfunc
when usinggo func
within the function,defer func
inside a function when using ago func
for signal calls]. but it works when directly used asdefer func(){}()
within main
- [
- defer does not work with go func. example
defer go func(...){}(...)
- defer does not work inside a func. example
defer func(...){}(...)
it becomes blocking - defer does not work within a func when using go routine inside. example
defer setupSignalHandlerThree
- defer does not work within a func when using go routine inside. example
defer setupSignalHandlerFour
<code>package main
import (
"encoding/json"
"fmt"
"os"
"os/signal"
"path/filepath"
)
func dumpOnExit(filename, data) {
// some dump logic
}
// Signal handler for OS-level termination signals
func setupSignalHandler(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerTwo(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerThree(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerFour(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
func main() {
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandler(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandlerTwo(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerThree(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerFour(dumpFileName, data)
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
defer func() {
<-signals
if err := dumpOnExit(dumpFileName, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
</code>
<code>package main
import (
"encoding/json"
"fmt"
"os"
"os/signal"
"path/filepath"
)
func dumpOnExit(filename, data) {
// some dump logic
}
// Signal handler for OS-level termination signals
func setupSignalHandler(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerTwo(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerThree(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerFour(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
func main() {
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandler(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandlerTwo(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerThree(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerFour(dumpFileName, data)
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
defer func() {
<-signals
if err := dumpOnExit(dumpFileName, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
</code>
package main
import (
"encoding/json"
"fmt"
"os"
"os/signal"
"path/filepath"
)
func dumpOnExit(filename, data) {
// some dump logic
}
// Signal handler for OS-level termination signals
func setupSignalHandler(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerTwo(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerThree(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
go func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
// Signal handler for OS-level termination signals
func setupSignalHandlerFour(filename string, data Data) {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
// // THIS DOES NOT WORK
defer func() {
<-signals
if err := dumpOnExit(filename, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
func main() {
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandler(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// setupSignalHandlerTwo(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerThree(dumpFileName, data)
// // Set up signal handler for graceful termination
// // THIS DOES NOT WORK
// defer setupSignalHandlerFour(dumpFileName, data)
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
defer func() {
<-signals
if err := dumpOnExit(dumpFileName, data); err != nil {
fmt.Printf(`{"error":"Failed to dump JSON data on exit: %v"}n`, err)
}
os.Exit(0)
}()
}
what options do i have to have it concurrent and use it within a function.
1