package utils import ( "fmt" "sync" ) type MyStack struct { Stack []interface{} CType string lock sync.RWMutex Len int } func (c *MyStack) Push(obj interface{}) { c.lock.Lock() if c.Len == len(c.Stack) { c.Stack = c.Stack[1:] } defer c.lock.Unlock() c.Stack = append(c.Stack, obj) } func (c *MyStack) Pop() error { len := len(c.Stack) if len > 0 { c.lock.Lock() defer c.lock.Unlock() c.Stack = c.Stack[:len-1] return nil } return fmt.Errorf("Pop Error: Stack is empty") } func (c *MyStack) Front() (interface{}, error) { len := len(c.Stack) if len > 0 { c.lock.Lock() defer c.lock.Unlock() return c.Stack[len-1], nil } return "", fmt.Errorf("Peep Error: Stack is empty") } func (c *MyStack) Size() int { return len(c.Stack) } func (c *MyStack) Empty() bool { return len(c.Stack) == 0 }