Go 使用默认参数的技巧

Functional Options Pattern in 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)
}

最新文章

  1. VS2010中整理代码快捷键
  2. Java文件写入,换行
  3. JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接
  4. IOS 公共类-MyMBProgressUtil Progress显示
  5. JavaScript学习笔记——数组
  6. 关于shell脚本时遇value too great for base (error token is "08")
  7. 基于jquery的-获取短信验证码-倒计时
  8. 基于Stm32的MP3播放器设计与实现
  9. C语言学习第八章
  10. vs code 使用git
  11. Python 部分系统类的常用方法整理
  12. .net 调用 网易云的短信验证
  13. python中的特殊成员
  14. 润乾V4导出TXT时自定义分隔符
  15. grep -A -B -C
  16. java中高级面试题整理及参考答案
  17. Android Studio的串口通讯开发
  18. python 网络编程——客户端
  19. Mixins 改成使用高阶组件调用
  20. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

热门文章

  1. Java 字符编码(一)Unicode 字符编码
  2. 【mysql】:mysql性能优化总结
  3. dubbo入门学习 二 RPC框架
  4. python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用
  5. mysql第一课,数据库的简单简单操作方法(配图略虐狗)
  6. Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
  7. mysql查询前一天的数据
  8. REdis MASTER aborted replication NOAUTH Authentication required
  9. cobbler实现系统自动化安装centos
  10. 基于jmeter的性能测试平台(二) 一个构想