Skip to content

Instantly share code, notes, and snippets.

View kben19's full-sized avatar

Kelvin Benzali kben19

  • Melbourne
View GitHub Profile
@kben19
kben19 / wallet.go
Last active August 8, 2021 07:12
Wallet example on defer evaluated param
type Wallet struct {
money int
}
func (wallet *Wallet) MyMoney() {
fmt.Println("$", wallet.money)
}
func (wallet *Wallet) AddMoney(money int) {
wallet.money += money
@kben19
kben19 / sql.go
Last active August 8, 2021 03:49
Bad code practice of defer on sql
db, err := sql.Open()
if err != nil {
log.Fatal(err)
}
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer func() {
@kben19
kben19 / sql-good.go
Created August 8, 2021 03:53
Good practice of defer usage on sql
db, err := sql.Open()
if err != nil {
log.Fatal(err)
}
defer func (){
if errDB := db.Close(); errDB != nil {
log.Fatal(errDB)
}
}
@kben19
kben19 / general_error.go
Created August 8, 2021 03:59
recover defer using custom general error
type generalError struct {
text string
code CodeStatus
}
func (error *generalError) Error() string {
return fmt.Sprintf("%s %d", error.text, error.code)
}
func NewError(text string) error {
@kben19
kben19 / retail.go
Created August 15, 2021 14:50
Interface example of retail
type WarehouseItf interface {
GetProduct(id int) (Product, error)
InsertProduct(product Product) error
}
type Retail struct {
warehouse WarehouseItf
}
func (retail *Retail) GetMyProduct() ([]Product, error) {
import "errors"
type WarehouseMock struct {}
func(warehouse *WarehouseMock) GetProduct(id int) (Product, error){
if id != 1 {
return Product{}, errors.New("test")
}
return Product{}, nil
}
@kben19
kben19 / formatter.go
Created February 23, 2022 17:43
Golang JSON library wrapper
package formatter
// golangJSONItf interface implements all the functions of GolangJSON.
type golangJSONItf interface {
Marshal(v interface{}) ([]byte, error)
}
// Formatter uses local json library wrapper rather than encoding/json.
type Formatter struct {
golangJSON golangJSONItf
@kben19
kben19 / main.go
Created April 2, 2022 10:47
Wrapper
import (
"net/http"
"time"
)
func main() {
httpClient := &http.Client{Timeout: time.Duration(3) * time.Second}
cacheService := NewCache()
service := NewService(httpClient, cacheService)
@kben19
kben19 / service.go
Created April 2, 2022 11:28
Wrapper Caching
func (wrapper *ServiceWrapper) GetProductStock(id int) (stock int, err error) {
key := fmt.Sprintf("key-%d", id)
value, err := wrapper.cache.Get(key)
if err == nil && value != "" {
stock, _ = strconv.Atoi(value)
return
}
defer func () {
_ = wrapper.cache.Set(key, strconv.Itoa(stock))
@kben19
kben19 / service.go
Created April 2, 2022 11:40
Wrapper Versioning
func (wrapper *ServiceWrapper) GetProductStock(id int) (int, error) {
// Get Version 2
if id > 100 {
return wrapper.service.GetProductStockV2(id)
}
// Otherwise, use the old version
return wrapper.service.GetProductStock(id)
}