golang 语言的思考

背景

自从接触 golang 语言后,发现编程是简化了不少,不用把大量时间消耗在如何正确编写代码,而专注于代码的实现。

心得

优势

  1. 开发时顺着设计思路,实现不会跑偏。
  2. 并发逻辑高效,随时开协程。

劣势:

复用比较费劲,复杂的设计模式实现起来不容易。

golang 没有继承的概念,只有组合,多态支持的不完整。通过组合来实现方法的覆盖,这里有个严重的问题,就是覆盖的方法 A 中,如果调用了内嵌结构体的方法 B,该方法 B 运行就在内嵌结构体,如果在方法 B 调用覆盖的其他方法是无效的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type Base struct{}

func (b *Base) MethodA() {
fmt.Println("Base MethodA")
b.MethodB() // 调用 Base 的 MethodB
}

func (b *Base) MethodB() {
fmt.Println("Base MethodB")
}

type Derived struct {
Base
}

func (d *Derived) MethodB() {
fmt.Println("Derived MethodB")
}

func main() {
d := Derived{}
d.MethodA() // 输出: Base MethodA, Base MethodB
}

如果你在覆盖的方法中调用了内嵌结构体的方法,可能会导致不符合预期的行为。因为内嵌结构体的方法调用不会自动使用外层结构体中覆盖的方法,而是使用内嵌结构体原有的方法。

为了避免这种情况:

  1. 避免在覆盖的方法中调用内嵌结构体的方法:如果可能,尽量在覆盖的方法中直接实现所需的逻辑,而不是依赖内嵌结构体的方法。
  2. 使用接口:通过接口来定义行为,并在外层结构体中实现这些接口。这可以提供更好的多态性和灵活性。
  3. 重新考虑设计,看看是否有更好的方式来组织代码。
  4. 单元测试尽量覆盖一下,避免出现预期外的情况。