下面代码输出什么?
type A interface {
ShowA() int
}
type B interface {
ShowB() int
}
type Work struct {
i int
}
func (w Work) ShowA() int {
return w.i + 10
}
func (w Work) ShowB() int {
return w.i + 20
}
func main() {
var a A = Work{3}
s := a.(Work)
fmt.Println(s.ShowA())
fmt.Println(s.ShowB())
}
- A. 13 23
- B. compilation error
打卡
我还以为这里又有坑呢
mark
m
居然没有坑
mark
打卡
mark
m
13 23
这道题可以和第 15 天的第三题 和第 16 天的第三题结合起来看。这个15天和16天在哪看?
1
mark。。。
打卡学习
知识点:类型断言。
A. 13 23
类型断言回
1
mark
mark
mark
s := a.(Work) a A ==> Work 结构体,实现了两个接口
mark
同问
mk
mark
mark
s type 是 Work。 断言类型是 assertion 。要注意方法接收者的类型,如果这是里
这样就不行,因为有些变量,无法取得地址,所以编译报错。 反过来是可以的,知道地址,一定可以取得那个地址的变量的值
打卡
make
mark
mark
mk
打卡
类型转换
首先,我们定义了两个接口A和B,分别包含方法ShowA()和ShowB()。
然后,我们定义了一个结构体Work,并实现了A和B接口中对应的方法ShowA()和ShowB()。在这些方法中,它们都会返回结构体字段i与一个常数的和。
在main()函数中,我们创建了一个Work类型的变量,其值为Work{3},这意味着它的字段i被初始化为3。
接着,我们将这个Work类型的变量赋值给接口类型A的变量a,由于Work类型已经实现了A接口的所有方法,所以这是一个有效的赋值操作。
之后,我们使用类型断言(a.(Work))将接口变量a转换回Work类型,并赋值给s。这里是通过类型断言确保s可以调用Work的其他方法。
最后,我们分别调用s.ShowA()和s.ShowB()方法,它们会返回w.i + 10和w.i + 20,因为这里的w.i是3,所以输出结果分别为13和23。
A. 13 23