浅析go语言中功能选项模式

Go语言中的功能选项模式是一种设计模式,用于在函数或方法中传递可变数量的选项。这种模式允许我们在不增加函数或方法参数的情况下,向其传递多个选项。

功能选项模式通常使用一个函数或方法,该函数或方法接受一个或多个函数类型的参数,这些函数类型的参数用于设置选项。这些函数类型的参数通常被称为选项函数。

假如要实现一个MyComputer函数,函数返回一个Computer实例,包含不同的配置选项:磁盘大小,cpu核心数,是否带GPU,冷却方式、品牌。

type Computer struct {
	disk         int
	cpus         int
	gpu          bool
	coldStyle    string
	manufacturer string
}

type Option func(computer *Computer)

func MyComputer(options ...Option) *Computer {
	// 默认选项
	c := &Computer{
		disk:         250,
		cpus:         8,
		gpu:          true,
		coldStyle:    "fan",
		manufacturer: "asus",
	}

	for _, v := range options {
		v(c)
	}
	return c
}

func ChoiceDisk(disk int) Option {
	return func(c *Computer) {
		c.disk = disk
	}
}

func ChoiceCpus(cpu int) Option {
	return func(c *Computer) {
		c.cpus = cpu
	}
}

func ChoiceGpu(gpu bool) Option {
	return func(c *Computer) {
		c.gpu = gpu
	}
}

func ChoiceClodStyle(clodStyle string) Option {
	return func(c *Computer) {
		c.coldStyle = clodStyle
	}
}

func ChoiceManufacture(manufacture string) Option {
	return func(c *Computer) {
		c.manufacturer = manufacture
	}
}

func main() {
	// 500G硬盘,32核,不带GPU,水冷, HP
	myComputer := MyComputer(
		ChoiceDisk(500),
		ChoiceCpus(32),
		ChoiceGpu(false),
		ChoiceClodStyle("water"),
		ChoiceManufacture("HP"),
	)
	fmt.Printf("%+v\n", *myComputer)

	// 不选择配置,默认
	fmt.Printf("%+v\n", *MyComputer())
}

程序执行结果:

{disk:500 cpus:32 gpu:false coldStyle:water manufacturer:HP}
{disk:250 cpus:8 gpu:true coldStyle:fan manufacturer:asus}

从该例中可以看出,Computer配置选项是通过对Computer值本身进行操作的函数调用实现的,并且通过使用变长参数函数,可以任意扩展传入的配置选项的个数。

功能选项设计模式的优点:

1.固定的API,增加配置项,如增加“CPU型号”、“GPU型号”等配置,API不会变化;

2.参数可读性更好;

3.配置项高度可扩展。

Go语言基础及实战 文章被收录于专栏

Go语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论

相关推荐

菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务