查看原文
其他

Go语言常见错误 | 未意识到类型嵌套的可能问题

云原生Go 源自开发者
2024-08-28

随着 Golang 所讲求的简洁性以及强类型系统,类型嵌套成为了 Go 程序员们常用的一种编程技巧。然而,如果对类型嵌套的行为和特性理解不清楚或者没有意识到,往往会导致常见但难以追踪的错误。本文将详细解读类型嵌套可能导致的问题,并且提供丰富的示例。

类型嵌套带来的改变

  1. 更改方法行为

类型嵌套影响了方法的行为。把一个类型嵌套在另一个类型中,如果这个被嵌套的类型有方法,那么在外面的类型也表现出这些行为。

例如:

type Foo struct {}
func (f Foo) Hello() { fmt.Println("Hello from Foo") }

type Bar struct { Foo }

然后,我们创造一个 Bar 的实例并尝试调用 Hello 方法:

b := Bar{}
b.Hello()  // 输出:Hello from Foo

这里 b 无需定义自己的 Hello 方法却能直接调用,但我们可能会误以为 Hello 方法是 Bar 对象自身的方法。

  1. 隐藏字段问题
type Foo struct { a int }
type Bar struct { Foo; a int; }

现在,如果我们尝试访问 Bara 字段:

b := Bar{Foo: Foo{a:1}, a:2}
fmt.Println(b.a)

你可能会感到困惑,因为这将打印 2,而不是 1。实际上,“隐藏”现象发生了,当你制造了一个 Bar 的实例并且试图访问 a,这将解析到最外层的 a 字段。如果你需要访问到 Fooa,你需要明确指定:b.Foo.a

如何避免或者修正这类错误

可以遵守以下几点来规避未意识到类型嵌套的可能问题:

  1. 在你设计类型时,如果你打算使用嵌套,一定要理解所嵌套的类型的行为以及这样做将如何改变新的类型。

  2. 尽量避免嵌套类型和外部类型具有相同名称的字段。更好的做法是让每个类型都有各自的唯一字段,避免冲突和隐藏。

  3. 使用更明确的方法调用和访问,避免产生歧义,如 b.Foo.ab.Foo.Hello()

总结

类型嵌套是 Golang 特有的一种途径,它为创建简洁且强大的自定义类型提供了便利性。但是不可避免地,如果我们对它的理解和使用不当,就可能容易出问题。我们要在日常的编程实践中,多思考、多尝试,以更好地理解和应用它。


文章精选

Go语言常见错误| 意外的变量隐藏

Go语言常见错误| 不必要的代码嵌套

Go语言常见错误| 误用init函数

Go语言常见错误| 滥用getters/setters

Go语言常见错误 | 接口污染

Go语言常见错误| 将接口定义在实现方一侧


点击关注并扫码添加进交流群领取「Go 语言」学习资料

继续滑动看下一个
源自开发者
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存