`
coolxing
  • 浏览: 874202 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:97288
社区版块
存档分类
最新评论

go是函数式编程语言吗?

阅读更多

[2012-05-19 翻译自这里, 对原文有所扩展, 也有所删减. 版权属于原作者, 转载必须保留此声明.]


go是函数式编程语言吗?
不是, 当然不是.

那么, go提供函数吗?
是的, 当然, 大多数编程语言都提供函数, go也不例外. 
func SayHello() {
    fmt.Println("Hello")
}
go使用关键字func定义函数, 并在函数体中编写函数逻辑. 

go函数可以接受参数吗?
额, 这个问题... 哦, 我懂了, 也许是我的SayHello函数给大家造成了错觉, 我会改造我的代码:
func SayHelloToSomeone(name string) {
    fmt.Println("Hello " + name + ".")
} 
函数SayHelloToSomeone接受一个string类型的参数name.

go函数是否可以有返回值?
是的, 是的, 是的! 就像数学意义上的函数一样, go函数可以返回给调用者一些东西. 为了演示这一点, 我将重新编写一个函数:
func GetGreeting (name string) string {
   greeting := "Hello " + name + "."
   return greeting
}
// test
greeting := GetGreeting("Bob")
fmt.Println(greeting) //outputs "Hello Bob." 
当然这没有什么, 其他语言也可以做到. 但是, 准备好接受惊喜了吗? 
go函数的返回值与其他类C语言有些不同, 比如, 你可以为返回值指定名称. 这带来至少2个好处:
1. 不需要在函数体中为返回值定义变量.
2. 无需在return语句后加上返回值. go会自动将返回值加上.
func GetGreeting (name string) (greeting string) {
   greeting = "Hello " + name + "."
   return
} 
GetGreeting函数为其返回值指定了名称: greeting. 在函数体中就可以直接使用greeting变量了, greeting其实就相当于函数中定义的一个局部变量. 而且如你所见, GetGreeting函数的return语句后面没有加上返回值, 因为go会自动将greeting变量的值返回给调用者.

go函数可以返回多个值吗?
这, 这, 你是异想天开吗? 不过强大的go函数能够做到这一点, 哈哈. 要知道可以有多个返回值的函数可以避免很多丑陋的代码, 下面是示例:
type Stack struct {
    pos  int
    data [10]int
}
func (s *Stack) Pop() (value int, ok bool) {
    if s.pos > 0 {
        s.pos--
        ok = true
        value = s.data[s.pos]
        return
    }
    ok = false
    return
} 
代码中首先定义了Stack类型, 并提供了Pop函数. Pop函数返回2个值: value和ok, 分别代表pop的值和pop操作是否成功.

go函数可以接受一个函数作为参数吗?
嗯, 我想你终于开始集中注意力了. 
如果你是一个医生, 你是否会对每次都需要向你的病人SayHello感到厌烦? 没关系, go可以帮助你. 首先需要定义新的数据结构:
type TormentList struct {
    patients []string
}
// 将[]string(string数组)包装成TormentList类型的指针
func NewTormentList(people []string) *TormentList {
   return &TormentList{people}
}
接下来, 让我们悄悄给TormentList类型增加Map方法:
func (g *TormentList) Map(f func(string)) {
	// 遍历g.patients, 为其每个value调用f方法
	for _, val := range(g.patients) {
		f(val)
	}
} 
Map方法接受f函数作为其输入参数, f函数接受一个string类型的值. 遍历TormentList的病人, 并为每个病人调用f函数.
现在已经做好了一切准备, 剩下的就是测试了:
patients := []string{"Anand", "David", "Ivan", "JoJo", "Jin", "Mon", "Peter", "Sachin"}
gl := NewTormentList(patients)
// 还记得上面定义的SayHelloToSomeone函数吧?
gl.Map(SayHelloToSomeone)

/*
outputs the following:

Hello Anand.
Hello David.
Hello Ivan.
Hello JoJo.
Hello Jin.
Hello Mon.
Hello Peter.
Hello Sachin.
*/
 
go函数的返回值可以是函数吗?
让我们先考虑一个现实问题: 假如你拥有一份吃过寿司的人的清单, 你是否能够根据人名确定他是否在清单上? 这是个很简单的问题, 你只需遍历清单. 嗯, 如果你go的功底很弱, 不知道怎么遍历清单那怎么办? 没关系, 我会给你提供一个刷选器:
func Screen(patients []string) func(string) bool {
    // 定义匿名函数并返回
   return func(name string) bool {
       for _, soul := range patients {
           if soul == name {
               return true
           }
       }
       return false
   }
} 
Screen方法会将刷选的函数返回给调用方, 这样你就可以不用懂怎么去遍历清单了, 你只需调用我返回给你的函数就可以:
// 吃过寿司的人的清单
those_who_bought_sushi := []string{"Anand", "JoJo", "Jin", "Mon", "Peter", "Sachin"}
// 得到刷选器函数
bought_sushi := Screen(those_who_bought_sushi)
// 调用刷选器函数就可以知道某人是否在清单上
fmt.Println(bought_sushi("Anand")) // true
fmt.Println(bought_sushi("Alex")) // false
 
1
1
分享到:
评论

相关推荐

    函数式编程语言:Haskell.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    Go-函数式编程及OptionalRx异步执行相关Library(forGolang)

    函数式编程在Go语言中的实现主要依赖于函数作为一等公民的特性,即函数可以作为参数传递、作为返回值以及存储在变量中。 "Optional"通常在面向对象编程中用于处理可能的空值,它提供了一种安全的方式来封装和操作...

    函数式编程语言:OCaml.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Elixir.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Elm.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Clojure.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Racket.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Erlang.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    函数式编程语言:Lisp.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    面向Java开发者的函数式编程

    - 深入研究特定函数式编程语言,如Scala或Haskell。 - 参加相关的在线课程或研讨会。 - 阅读更多关于函数式编程的高级主题和技术论文。 总的来说,《面向Java开发者的函数式编程》不仅是一本实用的指南,还为希望在...

    函数式编程语言:F#.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    Go语言中的函数式编程实践

    通过以上讨论,我们可以看到Go语言虽然不是纯函数式编程语言,但其支持闭包和接口等特性,使得开发者可以在Go中实践函数式编程的理念,如不可变性、纯函数、高阶函数等。这些特性有助于编写简洁、可测试和易于理解的...

    go语言中文教程及手册.pdf

    Go语言,也称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。Go语言的设计目标是提高程序员的工作效率,它具有高表达力、简洁、清晰和高效的特性。Go语言的一个显著特点...

    go语言编程,Go语言程序设计(英文版),学习 Go 语言(Golang),golang-china读书笔记

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎...

    Go-《Go编程基础》是一套Go语言的视频语音教程

    Go语言,又称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发效率,同时保持程序的高性能和可靠性。《Go编程基础》这套教程正是为了帮助初学者...

    go语言编程学习

    Go语言的设计深受C语言、Pascal以及函数式编程语言的影响,但同时也引入了许多创新特性,使得它在现代软件开发中独具特色。 标题"Go语言编程学习"暗示了我们将要探讨的是Go语言的基础概念、语法结构以及编程技巧。...

    go语言核心编程

    Go语言,也称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎。...

    Go语言编程1

    Go语言推崇函数式编程和命令式编程的结合,通过简洁的语法和类型系统,鼓励编写清晰、简洁的代码。它支持接口和结构体,提供了面向对象编程的特性,但同时也避免了类和继承的复杂性,更强调代码的组合和解耦。 书中...

Global site tag (gtag.js) - Google Analytics