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的函數,接受上面的閉包函數爲參數code
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) }