@@ -2,9 +2,9 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "errors"
5
6
"flag"
6
7
"fmt"
7
- "log"
8
8
"os"
9
9
"os/signal"
10
10
"runtime/debug"
@@ -15,12 +15,6 @@ import (
15
15
16
16
const projectName = "Go Project Template" // REPLACE WITH YOUR PROJECT NAME HERE
17
17
18
- var (
19
- debugLogs bool
20
- logPath string
21
- printVersion bool
22
- )
23
-
24
18
func usage () {
25
19
fmt .Fprintf (os .Stderr , `
26
20
<Project description>
@@ -39,23 +33,26 @@ For more information, see https://github.com/<user>/<repo>.
39
33
` [1 :])
40
34
}
41
35
42
- func init () {
43
- flag .Usage = usage
44
- flag .BoolVar (& debugLogs , "debug" , false , "enable debug logging" )
45
- flag .StringVar (& logPath , "l" , "stdout" , "path to log to" )
46
- flag .BoolVar (& printVersion , "version" , false , "print version and build information and exit" )
47
- }
48
-
49
36
func main () {
50
37
os .Exit (mainRetCode ())
51
38
}
52
39
53
40
func mainRetCode () int {
41
+ var (
42
+ debugLogs bool
43
+ logPath string
44
+ printVersion bool
45
+ )
46
+
47
+ flag .Usage = usage
48
+ flag .BoolVar (& debugLogs , "debug" , false , "enable debug logging" )
49
+ flag .StringVar (& logPath , "l" , "stdout" , "path to log to" )
50
+ flag .BoolVar (& printVersion , "version" , false , "print version and build information and exit" )
54
51
flag .Parse ()
55
52
56
53
info , ok := debug .ReadBuildInfo ()
57
54
if ! ok {
58
- log . Println ( "build information not found" )
55
+ fmt . Fprintln ( os . Stderr , "build information not found" )
59
56
return 1
60
57
}
61
58
@@ -76,14 +73,10 @@ func mainRetCode() int {
76
73
77
74
logger , err := logCfg .Build ()
78
75
if err != nil {
79
- log . Printf ( "error creating logger: %v" , err )
76
+ fmt . Fprintf ( os . Stderr , "error creating logger: %v" , err )
80
77
return 1
81
78
}
82
79
83
- // may also want to add syscall.SIGTERM on unix based OSes
84
- ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt )
85
- defer cancel ()
86
-
87
80
// log current version/commit
88
81
versionFields := []zap.Field {
89
82
zap .String ("version" , version ),
@@ -96,12 +89,36 @@ func mainRetCode() int {
96
89
}
97
90
logger .Info ("starting " + projectName , versionFields ... )
98
91
92
+ // may also want to add golang.org/x/sys/unix.SIGTERM on unix based OSes
93
+ ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt )
94
+ defer cancel ()
95
+
96
+ if err := mainErr (ctx , logger ); err != nil {
97
+ var exitCode * errJustExit
98
+ if errors .As (err , & exitCode ) {
99
+ return int (* exitCode )
100
+ }
101
+ fmt .Fprintln (os .Stderr , err )
102
+ return 1
103
+ }
104
+ return 0
105
+ }
106
+
107
+ type errJustExit int
108
+
109
+ func (e errJustExit ) Error () string { return fmt .Sprintf ("exit: %d" , e ) }
110
+
111
+ // this disables a linter warning because nil is unconditionally returned
112
+ // here, remove this when adding your own code that can return errors
113
+ //
114
+ //nolint:unparam
115
+ func mainErr (ctx context.Context , logger * zap.Logger ) error {
99
116
// START MAIN LOGIC HERE
100
117
101
118
<- ctx .Done ()
102
119
logger .Info ("shutting down" )
103
120
104
121
// STOP MAIN LOGIC HERE
105
122
106
- return 0
123
+ return nil
107
124
}
0 commit comments