Go 语言程序设计——过程式编程(5)

2019-07-01  本文已影响0人  hlemon

闭包

addPng := func(name string) string { return name + ".png" }
addJpg := func(name string) string { return name + ".jpg" }
fmt.Println(addPng("filename"), addJpg("filename"))
func MakeAddSuffix(suffix string) func(string) string {
  return func(name string) string {
    if !strings.HasSuffix(name, suffix) {
      return name + suffix
    }
    return name
  }
}

递归函数

for n := 0; n < 20; n++ {
  fmt.Print(Fibonacci(n), " ")
}
fmt.Println()

func Fibonacci(n int) int {
  if n < 2 {
    return n
  }
  return Fibonacci(n - 1) + Fibonacci(n - 2)
}
females := make([]int, 20)
males := make([]int, len(females))
for n := range females {
  females[n] = HofstadterFemale(n)
  males[n] = HofstadterMale(n)
}
fmt.Println("F", females)
fmt.Println("M", males)

func HofstadterFemale(n int) int {
  if n <= 0 {
    return 1
  }
  return n - HofstadterMale(HofstadterFemale(n - 1))
}
func HofstadterMale(n int) int {
  if n <= 0 {
    return 0
  }
  return n - HofstadterFemale(HofstadterMale(n - 1))
}

运行时选择函数

使用映射和函数引用来制造分支
var FunctionForSuffix = map[string]func(string) ([]string, error) {
  ".gz": GzipFileList,
  ".tar": TarFileList,
  ".tar.ga": TarFileList,
  ".tgz": TarFileList,
  ".zip": ZipFileList,
}

func ArchiveFileListMap(file string) ([]string, error) {
  if function, ok := FunctionForSuffix[Suffix(file)]; ok {
    return function(file)
  }
  return nil, errors.New("unrecognized archive")
}
动态函数的创建
var IsPalindrome func(string) bool
func init() {
  if len(os.Args) > 1 && (os.Args[1] == "-a" || os.Args[1] == "--ascii") {
    os.Args = append(os.Args[:1], os.Args[2:]...) // 去掉参数
    IsPalindrome = func(s string) bool { // 简单的 ASCII 版本
      if len(s) <= 1 {
        return true
      }
      if s[0] != s[len(s) - 1] {
        return false
      }
      return IsPalindrome(s[1 : len(s) - 1])
    }
  } else {
    IsPalindrome = func(s string) bool { // 简单的 ASCII 版本
    // 同前
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读