【发布时间】:2021-11-08 17:06:24
【问题描述】:
这样,如果msg指向空值,干净代码
如何处理func test(a SomeType) {
switch msg := a.(type) {
case *type1:
dosomething1(a)
case *type2:
dosomething2(a)
case *type3:
dosomething3(a)
default:
do()
}
主要功能可能是这个
func main() {
var b_ptr *stTest
aa := interface{}(b)
test(aa)
}
type test struct {
c int
d string
}
b_ptr 是一个指针,但它指向 nil,我想在 test func 中判断它 如果我在测试函数中使用 b_ptr,例如:打印 a.c 或 a.d,它会崩溃。
我就是这样做的。做if(),到处都用a,但是太笨了。
func test(a SomeType) {
switch msg := a.(type) {
case *type1:
if msg == nil {
return
}
dosomething1(a)
case *type2:
if msg == nil {
return
}
dosomething2(a)
case *type3:
if msg == nil {
return
}
dosomething3(a)
default:
do()
}
【问题讨论】:
-
类型断言返回第二个返回值(类型 bool),只有当它为真时才做 switch case
-
您可以使用
case nil:,或者在开关上方使用if a == nil { return }。但是,如果您尝试处理包含类型化nil指针的非零接口值,那么问题出在调用者身上。传递这些值是不好的做法。 -
您目前的方法在我看来是最干净的。这是不使用反射的最简洁的方法,我希望它会比反射更好。
标签: go pointers type-switch