不知道我关于类型断言的归纳对不对?

来源: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回答

ccmouse

2020-05-31

同学的理解是对的。补充一下interface{}这种任意类型,其实不是什么特殊的东西,是一个和其它接口地位完全相同的接口,只不过这个接口里面没有规定任何方法,导致所有的类型都被视为实现了这个interface{}接口。

var I interface{} := 1

这里其实和下面的Retriever接口一样,I的类型不是int,是interface{},使用I.(int)是将I的内容(一个int)拿出来而已。

1
1
qq_白澤_0
感谢老师本质的解答
2020-06-01
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程