feat: add experiments
- custom logger - simple mutex example
This commit is contained in:
parent
9f51b5e7d1
commit
f10b079055
4 changed files with 133 additions and 0 deletions
85
experiments/go/custom-logger/logger.go
Normal file
85
experiments/go/custom-logger/logger.go
Normal 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...)
|
||||||
|
}
|
10
experiments/go/custom-logger/main.go
Normal file
10
experiments/go/custom-logger/main.go
Normal 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.")
|
||||||
|
}
|
3
experiments/go/mutex/simple/go.mod
Normal file
3
experiments/go/mutex/simple/go.mod
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module mutex-training/simple
|
||||||
|
|
||||||
|
go 1.19
|
35
experiments/go/mutex/simple/main.go
Normal file
35
experiments/go/mutex/simple/main.go
Normal 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()
|
||||||
|
}
|
Loading…
Reference in a new issue