golang实现参数可变的技巧
2024-09-01 07:45:25
Go 使用默认参数的技巧
golang中没有函数默认参数的设计,因此需要些特别的技巧来实现。
假如我们需要订购一批电脑,其中电脑配置cpu,gpu,内存支持自定义。
type Computer interface {
PowerOn() error
PowerOff() error
}
type computer struct {
name string
cpu string
gpu string
memorySize int
}
定义自定义参数配置,创建一个默认的电脑配置
type pcConfigure struct {
cpu string
gpu string
memorySize int
}
var DefaultPConfigure = pcConfigure {
"i3 2120",
"GTX 660",
12}
创建一个闭包函数,接受自定义的配置参数,返回一个自定义的参数配置
type newPcConfigure func(*pcConfigure)
func newCpuConfigure(cpu string) newPcConfigure {
return func(o *pcConfigure) {
o.cpu = cpu
}
}
func newGpuConfigure(gpu string) newPcConfigure {
return func(o *pcConfigure) {
o.gpu = gpu
}
}
func newMemorySizeConfigure(memorySize int) newPcConfigure {
return func(o *pcConfigure) {
o.memorySize = memorySize
}
}
最后一步,定义一个构造coputer的函数,接受上面的闭包函数为参数
func newComputer(name string, opts ...newPcConfigure) *computer {
pcConfigure := DefaultPConfigure
for _, o := range opts {
o(&pcConfigure)
}
return &computer {
name: name,
cpu: pcConfigure.cpu,
gpu: pcConfigure.gpu,
memorySize: pcConfigure.memorySize}
}
完整代码
package main import (
"fmt"
) type pcConfigure struct {
cpu string
gpu string
memorySize int
} var DefaultPConfigure = pcConfigure {
"i3 2120",
"GTX 660",
12} type newPcConfigure func(*pcConfigure) func newCpuConfigure(cpu string) newPcConfigure {
return func(o *pcConfigure) {
o.cpu = cpu
}
} func newGpuConfigure(gpu string) newPcConfigure {
return func(o *pcConfigure) {
o.gpu = gpu
}
} func newMemorySizeConfigure(memorySize int) newPcConfigure {
return func(o *pcConfigure) {
o.memorySize = memorySize
}
} type Computer interface {
PowerOn() error
PowerOff() error
} type computer struct {
name string
cpu string
gpu string
memorySize int
} func newComputer(name string, opts ...newPcConfigure) *computer {
pcConfigure := DefaultPConfigure
for _, o := range opts {
o(&pcConfigure)
}
return &computer {
name: name,
cpu: pcConfigure.cpu,
gpu: pcConfigure.gpu,
memorySize: pcConfigure.memorySize}
} func (c *computer) PowerOn() (err error) {
return
} func (c *computer) PowerOff() (err error) {
return
} func main () {
pc1 := newComputer("pc1")
fmt.Println(pc1)
pc2 := newComputer("pc2", newCpuConfigure("i7 8700k"), newGpuConfigure("RTX 2080ti"))
fmt.Println(pc2)
}
最新文章
- VS2010中整理代码快捷键
- Java文件写入,换行
- JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接
- IOS 公共类-MyMBProgressUtil Progress显示
- JavaScript学习笔记——数组
- 关于shell脚本时遇value too great for base (error token is ";08";)
- 基于jquery的-获取短信验证码-倒计时
- 基于Stm32的MP3播放器设计与实现
- C语言学习第八章
- vs code 使用git
- Python 部分系统类的常用方法整理
- .net 调用 网易云的短信验证
- python中的特殊成员
- 润乾V4导出TXT时自定义分隔符
- grep -A -B -C
- java中高级面试题整理及参考答案
- Android Studio的串口通讯开发
- python 网络编程——客户端
- Mixins 改成使用高阶组件调用
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
热门文章
- Java 字符编码(一)Unicode 字符编码
- 【mysql】:mysql性能优化总结
- dubbo入门学习 二 RPC框架
- python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用
- mysql第一课,数据库的简单简单操作方法(配图略虐狗)
- Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
- mysql查询前一天的数据
- REdis MASTER aborted replication NOAUTH Authentication required
- cobbler实现系统自动化安装centos
- 基于jmeter的性能测试平台(二) 一个构想