gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:34 25 4
gpt4 key购买 nike

代码:

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

为什么类型转换适用于除错误之外的所有内容?

最佳答案

使用复合结构,您可以轻松匹配错误、myError 或其他内容。

error 和 myError 在同一个 switch 语句中是互斥的,但这应该不是问题。

实例化略有不同 myError{error:fmt.Errorf("TEST2")}

您不需要使用 ptr *myError(即 &myError..),因为错误是一个接口(interface),因此它将与您的类型的值接收器上定义的方法集匹配。

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

关于go - 为什么错误类型上的类型开关不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56096881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com