golang实现参数可变的技巧
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) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署