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)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM