I started to learn programming in Go and came up with a [Breakable Toy][1], which is a CLI for Gitlab. To get something up and running fast, I used some Go libraries: * [Ginkgo][2] for testing * [Cobra][3] for basic CLI stuff * [Sling][4] for HTTP requests and JSON mapping The project can be found in this [repository on Github][5]. I am looking for any feedback / code review that could help me to better understand the concepts and conventions of Go. I come from the Java world and have the impression that I try to stick too much on the object oriented world. So any feedback concerning code style and best-practices is highly appreciated. Besides general feedback, here are some specific questions: **1. Error Handling in Go** Being used to the `try catch` mechanism in Java, the `_, err :=` mechanism in Go seems a little unhandy to me. To me it looks as if I have to implement the "bubble up" of exceptions all by myself. Example: // HTTP client func (client *GitlabClient) Do(req *http.Request, value interface{}) (*http.Response, error) { resp, err := client.sling.Do(req, value, nil) return resp, err } // service func (service *ProjectsService) List() (*[]model.Project, error) { // ... _, err = service.Client.Do(req, projects) if err != nil { return nil, err } return projects, nil } // CLI command func(cmd *cobra.Command, args []string) error { projects, err := gitlabClient.Projects.List() if err != nil { return err } err = OutputJson(projects) return err } so there are really many LOCs only for error handling - is that the "way to go"? **2. Global Variables** The Cobra library seems to store values for CLI flags in global variables: var id string // ... projectGetCmd.PersistentFlags().StringVarP(&id, "id", "i", "", "(required) Either ID of project or 'namespace/project-name'") viper.BindPFlag("id", projectGetCmd.PersistentFlags().Lookup("id")) This makes it really hard to figure out which flags belong to which command and it's easy to re-initialize the same variable. See [`group.go`, line 31](https://github.com/michaellihs/golab/blob/b23f5f4ca2e3d30068b66d123408f7ea21b42f79/cmd/group.go#L31) for the full example. Is there any rule of thumb / best practice of how to namespace variables in Go besides structs? **3. Mocking in Unit Tests** I wrote some integration tests with Ginkgo that also simulate an HTTP server. This works quite nicely. But now I wanted to test, whether my CLI commands are calling the expected service methods and therefore I wanted to mock the services classes in the Unit tests for the commands. I couldn't find a convincing way for how to mock objects in Go. Can you give me any hint / resources for that? **Disclaimer** I am not expecting a full code review of my application. But if you have any suggestions for improvement, I'd be glad the get them. [1]: http://chimera.labs.oreilly.com/books/1234000001813/ch05.html#breakable_toys [2]: http://onsi.github.io/ginkgo/ [3]: https://github.com/spf13/cobra [4]: https://github.com/dghubble/sling [5]: https://github.com/michaellihs/golab/tree/b23f5f4ca2e3d30068b66d123408f7ea21b42f79