Hi,你们好,我是明哥。git
在本身学习 Golang 的这段时间里,我写了详细的学习笔记放在个人我的微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,所以写的东西应该会比较适合刚接触的同窗,若是你也是刚学习 Go 语言,不防关注一下,一块儿学习,一块儿成长。github
个人在线博客:golang.iswbm.com 个人 Github:github.com/iswbm/GolangCodingTimegolang
Type Assertion(中文名叫:类型断言),经过它能够作到如下几件事情 编程
i
是否为 nili
存储的值是否为某个类型具体的使用方式有两种:数组
第一种:微信
t := i.(T)复制代码
这个表达式能够断言一个接口对象(i)里不是 nil,而且接口对象(i)存储的值的类型是 T,若是断言成功,就会返回值给 t,若是断言失败,就会触发 panic。函数
来写段代码试验一下学习
package main
import "fmt"
func main() {
var i interface{} = 10
t1 := i.(int)
fmt.Println(t1)
fmt.Println("=====分隔线=====")
t2 := i.(string)
fmt.Println(t2)
}复制代码
运行后输出以下,能够发如今执行第二次断言的时候失败了,而且触发了 panicspa
10
=====分隔线=====
panic: interface conversion: interface {} is int, not string
goroutine 1 [running]:
main.main()
E:/GoPlayer/src/main.go:12 +0x10e
exit status 2复制代码
若是要断言的接口值是 nil,那咱们来看看也是否是也如预期同样会触发panic3d
package main
func main() {
var i interface{} // nil
var _ = i.(interface{})
}复制代码
输出以下,确实是会 触发 panic
panic: interface conversion: interface is nil, not interface {}
goroutine 1 [running]:
main.main()
E:/GoPlayer/src/main.go:5 +0x34
exit status 2复制代码
第二种
t, ok:= i.(T)复制代码
和上面同样,这个表达式也是能够断言一个接口对象(i)里不是 nil,而且接口对象(i)存储的值的类型是 T,若是断言成功,就会返回其类型给 t,而且此时 ok 的值 为 true,表示断言成功。
若是接口值的类型,并非咱们所断言的 T,就会断言失败,但和第一种表达式不一样的事,这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。
稍微修改下上面的例子,以下
package main
import "fmt"
func main() {
var i interface{} = 10
t1, 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{} // nil
t3, ok := k.(interface{})
fmt.Println(t3, "-", ok)
fmt.Println("=====分隔线3=====")
k = 10
t4, ok := k.(interface{})
fmt.Printf("%d-%t\n", t4, ok)
t5, ok := k.(int)
fmt.Printf("%d-%t\n", t5, ok)
}复制代码
运行后输出以下,能够发如今执行第二次断言的时候,虽然失败了,但并无触发了 panic。
10-true
=====分隔线1=====
-false
=====分隔线2=====
<nil> - false
=====分隔线3=====
10-true
10-true复制代码
上面这段输出,你要注意的是第二个断言的输出在-false
以前并非有没有输出任何 t2 的值,而是因为断言失败,因此 t2 获得的是 string 的零值也是 ""
,它是零长度的,因此你看不到其输出。
若是须要区分多种类型,能够使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。
package main
import "fmt"
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) // int
findType("hello") // string
var k interface{} // nil
findType(k)
findType(10.23) //float64
}
复制代码
输出以下
10 is int
hello is string
<nil> is nil
10.23 not type matched复制代码
额外说明一下:
case nil
系列导读
24. 超详细解读 Go Modules 前世此生及入门使用