golang实现参数可变的技巧

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)
}
posted @   yihailin  阅读(1896)  评论(0编辑  收藏  举报
编辑推荐:
· 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上本地化部署
点击右上角即可分享
微信分享提示