Почему переключение типа на тип ошибки не работает? - PullRequest
0 голосов
/ 12 мая 2019

код:

type baseStruct struct {
    value int
}

type myStruct baseStruct

func checkType(value interface{}) {
    switch value.(type) {
    case myStruct:
        fmt.Printf("%v is a myStruct\n", value)
    default:
        fmt.Printf("%v is something else\n", value)
    }
}

func main() {
    checkType(*new(baseStruct))
    checkType(myStruct(*new(baseStruct)))
}

выводит следующее:

{0} is something else
{0} is a myStruct

https://play.golang.org/p/f8GjAe_Pc2l

То же самое для примитивных типов: https://play.golang.org/p/sD320wtkAs2

И еще код:

type myError error

func checkType(value interface{}) {
    switch value.(type) {
    case myError:
        fmt.Printf("%v is a myError\n", value)
    default:
        fmt.Printf("%v is something else\n", value)
    }
}

func main() {
    checkType(fmt.Errorf("TEST1"))
    checkType(myError(fmt.Errorf("TEST2")))
}

выводит следующее:

TEST1 is a myError
TEST2 is a myError

https://play.golang.org/p/g6ZmSv3hDzA

Почему переключатель типа работает на всем, кроме ошибки?

1 Ответ

0 голосов
/ 12 мая 2019

при использовании составной структуры вы можете легко сопоставить error, myError или что-то еще.

error и myError являются исключительными в одном и том же операторе switch, но это не должно быть проблемой.

Создание экземпляранемного отличается myError{error:fmt.Errorf("TEST2")}.

Вам не нужно использовать ptr * myError (т. е. &myError..), поскольку error является интерфейсом, поэтому он будет соответствовать набору методов, определенному в получателе значений вашего типа.

package main

import (
    "fmt"
)

type myError struct {
    error
}

func checkType(value interface{}) {
    switch value.(type) {
    case myError:
        fmt.Printf("%v is a myError\n", value)
    // case error:
    //  fmt.Printf("%v is a %T\n", value, value)
    default:
        fmt.Printf("%v is something else\n", value)
    }
}

func main() {
    checkType(fmt.Errorf("TEST1"))
    checkType(myError{error:fmt.Errorf("TEST2")})
}

выходы

TEST1 is something else
TEST2 is a myError
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...