类型断言、方法集

题目:

如果 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
}

答案解析:

​ AC。

当涉及到方法调用时,Go 语言对于接收者的类型转换会有两种情况:

  1. 非指针类型的接收者调用方法:
    • 如果方法的接收者类型是指针类型 *T,而你使用非指针类型的变量 v 调用该方法,则编译器会自动将 v 转换为 *T 类型的指针,并调用相应的方法。
    • 示例:user.GetName(),其中 GetName() 的接收者类型是 *Student,但你可以使用 Student 类型的变量 user 进行调用。
  2. 指针类型的接收者调用方法:
    • 如果方法的接收者类型是非指针类型 T,而你使用指针类型的变量 p 调用该方法,则编译器会自动将 p 解引用为 *T 类型,并调用相应的方法。
    • 示例:user.GetId(),其中 GetId() 的接收者类型是 Student,但你可以使用 *Student 类型的指针变量 user 进行调用。


类型断言、方法集
http://example.com/2023/08/18/Go每日一题/类型断言、方法集/
作者
Feng Tao
发布于
2023年8月18日
更新于
2023年9月23日
许可协议