不知道我关于类型断言的归纳对不对?
来源:6-4 接口的值类型

qq_白澤_0
2020-05-28
其实typeassertion就是判断类型。但是是用于判断接口类型的。
无论常规接口还是老师说的任意类型,其实都是接口类型interface{}。
因为定义一个接口是
type 接口名 interface{
// 接口方法声明
}
定义一个任意类型也是
type 类型名字 interface{}
假设接口类型为I,要判断类型为T。
表达式 R = I.(T)
如果为任意类型,即x为值类型,int,string等等。如果I为T类型,则将I的内容值赋给R,(R为T类型值),否则为panic,可利用ok避免panic。
var I interface{} := 1
R := I.(int)
fmt.Println(R)
R := I.(string)//panic
fmt.Println(R)
R,ok := I.(string)
fmt.Println(R,ok)
如果为接口,即x为接口类型。如果I的接口类型为T,则将T类型的接口的内容(肚子里的东西)赋值给R,(R为T类型接口,可调用相对于方法和参数),否则为panic,可利用ok避免panic。
type Retriever interface {
Get(string) string
}
var r Retriever
r = &real.Retriever{
UserAgent: "Mozilla/5.0",
TimeOut: time.Minute,
}
//type assertion接口类型断言
realRetriever := r.(*real.Retriever)
fmt.Println(realRetriever.TimeOut)
if mockRetriever, ok := r.(mock.Retriever); ok {
fmt.Println(mockRetriever.Contents)
} else {
fmt.Println("not a mock retriever")
}
写回答
1回答
-
同学的理解是对的。补充一下interface{}这种任意类型,其实不是什么特殊的东西,是一个和其它接口地位完全相同的接口,只不过这个接口里面没有规定任何方法,导致所有的类型都被视为实现了这个interface{}接口。
var I interface{} := 1
这里其实和下面的Retriever接口一样,I的类型不是int,是interface{},使用I.(int)是将I的内容(一个int)拿出来而已。
112020-06-01
相似问题