Golang 结构体组合和指针:何时使用哪种方式?
golang 中的结构体组合和指针
在 go 语言中,没有传统的继承概念,而是采用结构体组合和指针的方式来重用代码。这两种结构体类型有着不同的实现方式:
组合:listener
type listener struct { base net.listener }
此结构体通过嵌入 net.listener 接口实现了一个组合。这意味着 listener 结构体会继承 net.listener 的所有方法和字段。
指针:conn
type Conn struct { *net.TCPConn }
此结构体使用指针引用了一个 net.tcpconn 指针。这意味着 conn 结构体会间接访问 net.tcpconn 的所有方法和字段。
区别
这两种结构体类型的区别在于内存分配和值传递:
- 组合:当创建 listener 结构体时,它将创建一个新的结构体,其中嵌入了一个 net.listener 实例。当将值传递给 listener 时,整个结构体将被复制。
- 指针:当创建 conn 结构体时,它会创建一个指针,指向一个现有的 net.tcpconn 实例。当将值传递给 conn 时,传递的只是指针,而不是整个结构体,因此内存使用更少。
总的来说,组合适合于希望继承实现的类型,而指针适合于希望重用现有实例的情况,同时保持较低的内存开销。