diff --git a/experiments/go/custom-logger/logger.go b/experiments/go/custom-logger/logger.go new file mode 100644 index 0000000..173d3ed --- /dev/null +++ b/experiments/go/custom-logger/logger.go @@ -0,0 +1,85 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "time" +) + +type logWriter struct { + level string + writer io.Writer +} + +func (w logWriter) Write(bytes []byte) (int, error) { + timestamp := time.Now().UTC().Format(time.RFC3339) + return fmt.Fprintf(w.writer, timestamp + " ["+w.level+"]\t"+string(bytes)) +} + +type logger struct { + infoLogger *log.Logger + errorLogger *log.Logger + debugLogger *log.Logger +} + +func newLogger(debug bool) *logger { + infoLogWriter := logWriter{ + level: "INFO", + writer: os.Stdout, + } + infoLogger := log.New(infoLogWriter, "", 0) + + errorLogWriter := logWriter{ + level: "ERROR", + writer: os.Stderr, + } + errorLogger := log.New(errorLogWriter, "", 0) + + var baseDebugWriter io.Writer + + if debug { + baseDebugWriter = os.Stdout + } else { + baseDebugWriter = io.Discard + } + + debugLogWriter := logWriter{ + level: "DEBUG", + writer: baseDebugWriter, + } + debugLogger := log.New(debugLogWriter, "", log.Lshortfile) + + l := logger{ + infoLogger: infoLogger, + errorLogger: errorLogger, + debugLogger: debugLogger, + } + + return &l +} + +func (l *logger) Infoln(v ...interface{}) { + l.infoLogger.Println(v...) +} + +func (l *logger) Infof(format string, v ...interface{}) { + l.infoLogger.Printf(format, v...) +} + +func (l *logger) Errorln(v ...interface{}) { + l.errorLogger.Fatalln(v...) +} + +func (l *logger) Errorf(format string, v ...interface{}) { + l.errorLogger.Fatalf(format, v...) +} + +func (l *logger) Debugln(v ...interface{}) { + l.debugLogger.Println(v...) +} + +func (l *logger) Debugf(format string, v ...interface{}) { + l.debugLogger.Printf(format, v...) +} diff --git a/experiments/go/custom-logger/main.go b/experiments/go/custom-logger/main.go new file mode 100644 index 0000000..eda9f17 --- /dev/null +++ b/experiments/go/custom-logger/main.go @@ -0,0 +1,10 @@ +package main + +func main() { + l := newLogger(true) + + l.Debugln("This is a debug log.") + l.Infoln("This is an info log.") + l.Infof("Formatting test: Number is %d.", 2) + l.Errorln("This is an error message.") +} diff --git a/experiments/go/mutex/simple/go.mod b/experiments/go/mutex/simple/go.mod new file mode 100644 index 0000000..d79c95f --- /dev/null +++ b/experiments/go/mutex/simple/go.mod @@ -0,0 +1,3 @@ +module mutex-training/simple + +go 1.19 diff --git a/experiments/go/mutex/simple/main.go b/experiments/go/mutex/simple/main.go new file mode 100644 index 0000000..20bf9c8 --- /dev/null +++ b/experiments/go/mutex/simple/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "fmt" + "sync" +) + +var x = 0 + +func main() { + var w sync.WaitGroup + var m sync.Mutex + + numRunners := 2000 + + w.Add(numRunners) + + for i := 0; i < numRunners; i++ { + go increment(&w, &m) + } + + w.Wait() + + fmt.Println("Final value of x: ", x) +} + +func increment(wg *sync.WaitGroup, m sync.Locker) { + m.Lock() + { + x = x + 1 + } + m.Unlock() + + wg.Done() +}