类型断言

题目:

如果 Add() 函数的调用代码为:

1
2
3
4
5
6
7
func main() {
var a Integer = 1
var b Integer = 2
var i interface{} = &a
sum := i.(*Integer).Add(b)
fmt.Println(sum)
}

则Add函数定义正确的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
A.
type Integer int
func (a Integer) Add(b Integer) Integer {
return a + b
}

B.
type Integer int
func (a Integer) Add(b *Integer) Integer {
return a + *b
}

C.
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}

D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {
return *a + *b
}

答案:

1
AC

解析:

​ 在 main 函数中,i 被定义为一个接口类型的变量,它的值是指向变量 a 的指针。当调用 Add 函数时,使用了类型断言 i.(*Integer) 来将接口类型的变量 i 转换为 *Integer 类型。类型断言的语法为 x.(T),其中 x 是一个接口类型的表达式,T 是一个类型。类型断言检查 x 的动态类型是否等于 T,如果检查成功,则返回 x 的动态值,否则会引发运行时恐慌。

​ 在这个例子中,由于 i 的动态类型为 *Integer,因此类型断言成功,并返回了指向变量 a 的指针。因此,当调用 Add 函数时,可以使用指针接收器 *Integer(选项 C),也可以使用值接收器 Integer(选项 A)。在 Go 语言中,当使用指针调用一个值接收器方法时,编译器会自动解引用该指针。

​ 同时,由于 b 是一个值类型的变量,所以在 Add 函数中应该使用值类型的参数 Integer。因此,选项 B 和 D 都是错误的。

​ 综上所述,正确答案是 A 和 C。


类型断言
http://example.com/2023/04/29/Go每日一题/类型断言/
作者
Feng Tao
发布于
2023年4月29日
更新于
2023年4月29日
许可协议