feat: add experiments

- custom logger
- simple mutex example
This commit is contained in:
Dan Anglin 2022-10-29 23:56:53 +01:00
parent 9f51b5e7d1
commit f10b079055
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
4 changed files with 133 additions and 0 deletions

View file

@ -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...)
}

View file

@ -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.")
}

View file

@ -0,0 +1,3 @@
module mutex-training/simple
go 1.19

View file

@ -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()
}