text: Q:
  
  Should I use panic or return error?
  
  Go provides two ways of handling errors, but I'm not sure which one to use.
  Assuming I'm implementing a classic ForEach function which accepts a slice or a map as an argument. To check whether an iterable is passed in, I could do:
  func ForEach(iterable interface{}, f interface{}) {
      if isNotIterable(iterable) {
          panic("Should pass in a slice or map!")
      }
  }
  
  or 
  func ForEach(iterable interface{}, f interface{}) error {
      if isNotIterable(iterable) {
          return fmt.Errorf("Should pass in a slice or map!")
      }
  }
  
  I saw some discussions saying panic() should be avoided, but people also say that if program cannot recover from error, you should panic().
  Which one should I use? And what's the main principle for picking the right one?
  
  A:
  
  From Dave Cheney:
  
  panics are always fatal to your program. In panicing you never assume
    that your caller can solve the problem. Hence panic is only used in
    exceptional circumstances, ones where it is not possible for your
    code, or anyone integrating your code to continue.
  
  You should assume that a panic will be immediately fatal, for the entire program, or at the very least for the current goroutine. Ask yourself "when this happens, should the application immediately crash?" If yes, use a panic; otherwise, use an error.
  
  A:
  
  Use panic.
  Because your use case is to catch a bad use of your API. This should never happen at runtime if the program is calling your API properly.
  In fact, any program calling your API with correct arguments will behave in the same way if the test is removed. The test is there only to fail early with an error message helpful to the programmer that did the mistake. Ideally, the panic might be reached once during development when running the testsuite and the programmer would fix the call even before committing the bad code, and that incorrect use would never reach production.
  See also this reponse to question Is function parameter validation using errors a good pattern in Go?.
  
  