汕头企业网站建设价格,国内国际时事心得体会,广东营销型网站建设,网站seo外链平台类型断言
作用
检查 i 是否为 nil检查 i 存储的值是否为某个类型
使用方式
第一种#xff1a;
t : i.(T)这个表达式可以断言一个接口对象#xff08;i#xff09;里不是 nil#xff0c;并且接口对象#xff08;i#xff09;存储的值的类型是 T#xff0c;如果断言成…类型断言
作用
检查 i 是否为 nil检查 i 存储的值是否为某个类型
使用方式
第一种
t : i.(T)这个表达式可以断言一个接口对象i里不是 nil并且接口对象i存储的值的类型是 T如果断言成功就会返回值给 t如果断言失败就会触发 panic。(即nil或者接口对象类型不为T时均会触发panic) eg;
func main() {var i interface{} 10t1 : i.(int)fmt.Println(t1)fmt.Println(分隔线)t2 : i.(string)fmt.Println(t2)
}可以发现在执行第二次断言的时候失败了并且触发了 panic。
第二种
t, ok: i.(T) 和上面一样这个表达式也是可以断言一个接口对象i里不是 nil并且接口对象i存储的值的类型是 T如果断言成功就会返回其值给 t并且此时 ok 的值 为 true表示断言成功。 如果接口值的类型并不是我们所断言的 T就会断言失败但和第一种表达式不同的事这个不会触发 panic而是将 ok 的值设为 false 表示断言失败此时t 为 T 的零值。 eg
func main() {var i interface{} 10t1, ok : i.(int)fmt.Printf(%d-%t\n, t1, ok)fmt.Println(分隔线1)t2, ok : i.(string)fmt.Printf(%s-%t\n, t2, ok)fmt.Println(分隔线2)var k interface{} // nilt3, ok : k.(interface{})fmt.Println(t3, -, ok)fmt.Println(分隔线3)k 10t4, ok : k.(interface{})fmt.Printf(%d-%t\n, t4, ok)t5, ok : k.(int)fmt.Printf(%d-%t\n, t5, ok)
}类型断言Type Switch
如果需要区分多种类型可以使用 type switch 断言这个将会比一个一个进行类型断言更简单、直接、高效。 func findType(i interface{}) {switch x : i.(type) {case int:fmt.Println(x, is int)case string:fmt.Println(x, is string)case nil:fmt.Println(x, is nil)default:fmt.Println(x, not type matched)}
}
func main() {findType(10) // intfindType(hello) // stringvar k interface{} // nilfindType(k)findType(10.23) //float64
}注: 类型断言仅能对静态类型为空接口interface{}的对象进行断言否则会抛出错误。 类型断言完成后实际上会返回静态类型为你断言的类型的对象而要清楚原来的静态类型为空接口类型interface{}这是 Goang的隐式转换。