Golang 选项模式(Option模式)
Option模式的专业术语为:Functional Options Pattern(函数式选项模式)
Option模式为golang的开发者提供了将一个函数的参数设置为可选的功能,也就是说我们可以选择参数中的某几个,并且可以按任意顺序传入参数。
比如针对特殊场景需要不同参数的情况,C++可以直接用重载来写出任意个同名函数,在任意场景调用的时候使用同一个函数名即可;但同样情况下,在golang中我们就必须在不同的场景使用不同的函数,并且参数传递方式可能不同的人写出来是不同的样子,这将导致代码可读性差,维护性差。
Option模式的优缺点
优点
- 支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性
- 任意顺序传递参数
- 支持默认值
- 方便拓展
缺点
- 增加许多function,成本增大
- 参数不太复杂时,尽量少用
Option模式demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package main // fixme : url https://blog.csdn.net/lazyboy_/article/details/103289750 import "fmt" type Message struct { id int name string address string phone int } func (msg Message) String() { fmt.Printf( "ID:%d \n- Name:%s \n- Address:%s \n- phone:%d\n" , msg.id, msg.name, msg.address, msg.phone) } func New(id, phone int, name, addr string) Message { return Message{ id: id, name: name, address: addr, phone: phone, } } type Option func (msg *Message) var DEFAULT_MESSAGE = Message{id: -1, name: "-1" , address: "-1" , phone: -1} func WithID(id int) Option { return func (m *Message) { m.id = id } } func WithName(name string) Option { return func (m *Message) { m.name = name } } func WithAddress(addr string) Option { return func (m *Message) { m.address = addr } } func WithPhone(phone int) Option { return func (m *Message) { m.phone = phone } } func NewByOption(opts ...Option) Message { msg := DEFAULT_MESSAGE for _, o := range opts { o(&msg) } return msg } func NewByOptionWithoutID(id int, opts ...Option) Message { msg := DEFAULT_MESSAGE msg.id = id for _, o := range opts { o(&msg) } return msg } func main() { message1 := New(1, 123, "message1" , "cache1" ) message1.String() message2 := NewByOption(WithID(2), WithName( "message2" ), WithAddress( "cache2" ), WithPhone(456)) message2.String() message3 := NewByOptionWithoutID(3, WithAddress( "cache3" ), WithPhone(789), WithName( "message3" )) message3.String() } /* Output ID:1 - Name:message1 - Address:cache1 - phone:123 ID:2 - Name:message2 - Address:cache2 - phone:456 ID:3 - Name:message3 - Address:cache3 - phone:789 */ |
转载自 :https://blog.csdn.net/lazyboy_/article/details/103289750
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!