为什么错误类型上的类型开关不起作用?

时间:2019-05-12 06:53:20

标签: go

代码:

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 :(得分:0)

使用复合结构,您可以轻松地匹配错误,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