写点什么

Golang function

用户头像
escray
关注
发布于: 2021 年 05 月 20 日
Golang function

极客时间《Go 语言核心 36 讲》学习笔记 07,图片来自网络

12 | 使用函数的正确姿势


看完这一节,印象最深的同样是终于搞明白什么是“闭包”——在一个函数中存在对外来标识符的引用。


之前似乎在 JavaScript 中最早听说过函数是一等公民,就是可以把函数赋值给一个变量,或者是当做参数传递,也可以返回一个函数。


Python 里面似乎也有类似的提法。


用过 Ruby 里面的 Proc 对象,用它作为函数的包装类,实现类似于一等公民的计算。


不过好像并没有体会过将函数作为一等公民所带来的“优势”,主要还是因为自己代码写的少。


文章里面说“函数值可以由此成为能够被随意传播的独立逻辑组件”,这句话确实抽象的层次更高一些。

看完这一节,其实也就理解了什么是函数式编程,当然也包括所谓高阶函数。


卫述语句这个翻译感觉比较别扭,其实就说 guard clause 好了,其他语言里面也有类似的语句,但是好像没有称之为“卫述”。


guard clause 似乎是从 nested conditions 的重构引入的,其他语言有类似的说法。


用 calculate 这样的例子在 JavaScript 和其他的语言中也见到过,但是似乎不能体现“函数编程之美”。


在程序运行的过程中,根据需要生成功能不同的函数,继而影响后续的程序行为


希望能够在不久的将来,看到或者写出这样的程序。


最后,贴一段代码


package go_36
import ( "errors" "fmt" "testing")
type Printer func(contents string) (n int, err error)
func printToStd(contents string) (bytesNum int, err error) { return fmt.Println(contents)}
func TestDemo26(t *testing.T) { var p Printer p = printToStd a, e := p("something123") fmt.Println(a, e)}
type operate func(x, y int) int
// 方案 1func calculate(x int, y int, op operate) (int, error) { if op == nil { return 0, errors.New("invalid operation") } return op(x, y), nil}
// 方案 2type calculateFunc func(x int, y int) (int, error)
func genCalculator(op operate) calculateFunc { return func(x int, y int) (int, error) { if op == nil { return 0, errors.New("invalid operation") } return op(x, y), nil }}
func TestDemo27(t *testing.T) { // 方案 1 x, y := 12, 23 op := func(x, y int) int{ return x * y } result, err := calculate(x, y, op) fmt.Println(result, err) result, err = calculate(x, y, nil) fmt.Println(result, err)
// 方案 2 x, y = 56, 78 add := genCalculator(op) result, err = add(x, y) fmt.Println(result, err)}
func modifyArray(a [3]string) [3]string { a[1] = "x" return a}
func modifySlice(a []string) []string { a[1] = "slice" return a}
func modifyComplexArray(a [3][]string) [3][]string { a[1][1] = "slice" a[2] = []string{"new", "array", "q"} return a}
func TestDemo28(t *testing.T) { // 示例 1,修改数组,原始数组不变 array1 := [3]string{"a", "b", "c"} fmt.Println(array1) array2 := modifyArray(array1) fmt.Println(array2) fmt.Println(array1)
// 示例 2,修改切片,原始切片变化 slice1 := []string{"x", "y", "z"} fmt.Println(slice1) slice2 := modifySlice(slice1) fmt.Println(slice2) fmt.Println(slice1)
// 示例 3,修改数组时,原始数组不变;修改数组中切片,原始切片变化 complexArray1 := [3][]string { []string{"d", "e", "f"}, []string{"g", "h", "i"}, []string{"j", "k", "l"}, } fmt.Println(complexArray1) complexArray2 := modifyComplexArray(complexArray1) fmt.Println(complexArray2) fmt.Println(complexArray1)}
复制代码


发布于: 2021 年 05 月 20 日阅读数: 8
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Golang function