常见使用场景
- 代码复用:
- 当多个结构体有部分相同的字段和方法时,可以将这些公共部分提取到一个嵌入结构体中,从而实现代码复用。
- 例如,在一个图形绘制项目中,有
Circle
和Rectangle
结构体,它们都可能有Color
和Position
相关的属性,这时可以定义一个公共的嵌入结构体。
package main
import "fmt"
// ShapeProps 嵌入结构体,包含公共属性
type ShapeProps struct {
Color string
X int
Y int
}
// Circle 圆形结构体,嵌入ShapeProps
type Circle struct {
ShapeProps
Radius int
}
// Rectangle 矩形结构体,嵌入ShapeProps
type Rectangle struct {
ShapeProps
Width int
Height int
}
func (c Circle) Draw() {
fmt.Printf("Drawing a circle at (%d, %d) with radius %d and color %s\n", c.X, c.Y, c.Radius, c.Color)
}
func (r Rectangle) Draw() {
fmt.Printf("Drawing a rectangle at (%d, %d) with width %d, height %d and color %s\n", r.X, r.Y, r.Width, r.Height, r.Color)
}
- 实现接口:
- 通过嵌入实现了某个接口的结构体,当前结构体可以自动满足该接口。
- 比如有一个
Logger
接口,FileLogger
结构体实现了这个接口,在另一个需要记录日志的结构体中嵌入FileLogger
,这样该结构体也能满足Logger
接口。
package main
import "fmt"
// Logger 日志接口
type Logger interface {
Log(message string)
}
// FileLogger 文件日志结构体,实现Logger接口
type FileLogger struct {
FilePath string
}
func (fl FileLogger) Log(message string) {
fmt.Printf("Logging to file %s: %s\n", fl.FilePath, message)
}
// App 应用结构体,嵌入FileLogger
type App struct {
FileLogger
Name string
}
- 构建分层结构:
- 在复杂的业务逻辑中,使用嵌入结构体可以构建一种分层的结构体关系,使得代码结构更清晰。
- 例如在一个电商系统中,有一个
Order
结构体,它可能嵌入UserInfo
结构体(包含下单用户信息)和ProductList
结构体(包含订单中的商品列表信息)。
package main
import "fmt"
// UserInfo 用户信息结构体
type UserInfo struct {
Name string
Email string
}
// Product 商品结构体
type Product struct {
Name string
Price float64
}
// ProductList 商品列表结构体
type ProductList struct {
Products []Product
}
// Order 订单结构体,嵌入UserInfo和ProductList
type Order struct {
UserInfo
ProductList
OrderID string
}
func (o Order) PrintOrder() {
fmt.Printf("Order ID: %s\nUser: %s - %s\n", o.OrderID, o.Name, o.Email)
fmt.Println("Products:")
for _, p := range o.Products {
fmt.Printf("- %s: $%.2f\n", p.Name, p.Price)
}
}