go语言结构体组合的差异分析
本文将探讨go语言中两种结构体的区别,它们分别是:
type Listener struct {
base net.Listener
}
type Conn struct {
*net.TCPConn
}许多开发者初学go时,可能会将这两种结构体与面向对象编程中的继承概念混淆。需要明确的是,go语言没有继承机制。上述两种结构体都采用了go语言中常见的结构体组合方式,但其组合方式存在细微差别。
首先,listener 结构体组合了一个 net.listener 接口类型。net.listener 接口定义了一系列方法,例如 accept、close 等。通过组合 net.listener,listener 结构体获得了这些方法,实现了接口的功能。这是一种值嵌入,listener 结构体拥有 base 的一个副本。修改 listener.base 不会影响原始的 net.listener 对象,反之亦然。
其次,conn 结构体组合了一个 *net.tcpconn 指针。这表示 conn 结构体包含了 net.tcpconn 的一个指针,而不是其副本。这意味着 conn 结构体直接操作的是 net.tcpconn 对象本身。修改 conn 结构体中的成员会直接影响原始的 net.tcpconn 对象。这是一种指针嵌入,效率更高,但需要小心处理指针的有效性和生命周期。
立即学习“go语言免费学习笔记(深入)”;
总而言之,两种结构体都通过组合实现了代码复用,但 listener 使用值嵌入,而 conn 使用指针嵌入,这导致了它们在内存管理和数据访问方式上的不同。 需要注意的是,这与面向对象编程中的继承完全不同,go语言通过组合来实现类似的功能。










