lose() error { return nil } var v any = T{} switch v.(type) { case io.Reader: // ... case io.ReadCloser: // unreachable } Even though \'T\' has a \'Close\' method and thus implements \'io.ReadCloser\', \'io.Reader\' will always match first. The method set of \'io.Reader\' is a subset of \'io.ReadCloser\'. Thus it is impossible to match the second case without matching the first case. Structurally equivalent interfaces A special case of the previous example are structurally identical interfaces. Given these declarations type T error type V error func doSomething() error { err, ok := doAnotherThing() if ok { return T(err) } return U(err) } the following type switch will have an unreachable case clause: switch doSomething().(type) { case T: // ... case V: // unreachable } \'T\' will always match before V because they are structurally equivalent and therefore \'doSomething()\''s return value implements both.