代码:
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
为什么类型开关对除错误之外的所有东西都起作用?
答案 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