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