下面代码输出什么?
package main
import "fmt"
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
A 在线运行
代码分析
-
接口和结构体定义:
- 定义了两个接口
A和B,分别包含方法ShowA()和ShowB()。 - 定义了一个结构体
Work,并为其实现了ShowA()和ShowB()方法。
- 定义了两个接口
-
接口赋值:
- 在
main函数中,var a A = Work{3}将Work{3}赋值给接口变量a。此时a的动态类型是Work,动态值是Work{3}。
- 在
-
类型断言:
s := a.(Work)通过类型断言将接口变量a转换为其具体类型Work。由于a的动态类型确实是Work,类型断言成功,s是Work{3}。
-
方法调用:
s.ShowA()调用ShowA()方法,返回w.i + 10,即3 + 10 = 13。s.ShowB()调用ShowB()方法,返回w.i + 20,即3 + 20 = 23。
-
输出结果:
fmt.Println(s.ShowA())输出13。fmt.Println(s.ShowB())输出23。