* Marvin Renich <m...@renich.org> [171002 11:31]: > * Chris Hopkins <cbehopk...@gmail.com> [171002 10:52]: > > out, err := os.Create(potential_file_name) > > switch t := err.(type) { > > case *os.PathError: > > switch t.Err { > > case os.ErrNotExist: > > log.Fatal("Invalid filename", potential_file_name) > > case os.ErrInvalid: > > log.Fatal("Invalid argument", potential_file_name) > > default :
Additionally, os.Create, os.Open, and os.OpenFile all guarantee (via their documentation and the Go 1 Compatibility Guarantee) that if they return a non-nil error, it will be of type *os.PathError, so you could, if you wish, replace the "switch t := err.(type)" with t = err.(*os.PathError) and if it panics, you can file a bug. Furthermore, because the current implementation is extremely unlikely to change, you can simplify even more. I would write this as: var out, err = os.Create(potential_file_name) if err != nil { var pe = err.(*os.PathError) // let it panic or use the ,ok trick as below var en, ok = pe.Err.(syscall.Errno) // not a Go 1 Compat guarantee, so handle failed type assertion if !ok { log.Fatalf("Unexpected error from os.Create: %s\n", pe) } switch en { case syscall.EEXIST: ... case syscall.EISDIR: ... case syscall.EINVAL: ... } } This code is much more readable than the nested type switch that you are using. Note that os.ErrNotExist and os.ErrInvalid are not of type *os.PathError and os.Create will never return either of them (promised by Go 1 Compat). If the !ok test ever succeeds, you know that the implementation of os.OpenFile has changed. ...Marvin -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.