observer design pattern golang