design patterns in golang