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

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
分享到:
评论

相关推荐

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

    主要介绍了Go语言中的函数式编程实践,主要讲解Go语言中的函数式编程概念和使用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    中文名: 面向Java开发者的函数式编程 原名: Functional Programming for Java Developers 作者: Dean Wampler 资源格式: PDF 版本: 英文文字版/更新EPUB版本/更新MOBI版本 出版社: O'Reilly书号: 978-1-4493-1103-2...

    Learning-Functional-Programming-in-Go:Packt出版的《 Go中的函数式编程》。

    在Go中学习函数式编程 这是发布的的代码库。 它包含从头到尾完成本书所必需的所有支持项目文件。 关于这本书 本书通过向您展示如何在Golang中创建和使用函数构造,弥合了Golang开发人员的语言鸿沟。 说明和导航 所有...

    Golang+Gin框架入门实战教程

    Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。本教程是IT营大地老师在2020年4... 最新Golang教程,从环境搭建、语言语法特性到函数式编程、并发编程等等。理论与实战结合,帮助快速掌握Go语言。

    Go语言实战

    Go语言实战.pdf ,看完了go语言圣经,这本书仍值得一看!!

    leetcode添加元素使和等于-go-ccmouse:去鼠标

    本课程将从基本语法讲起,逐渐深入,帮助同学深度理解Go语言面向接口,函数式编程,错误处理,测试,并行计算等元素,并带领大家实现一个分布式爬虫的实战项目。 共 5 节 (46分钟) 收起列表 1-1 Google资深工程师...

    Go语言程序设计中文版[人民邮电大学出版]

    8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322...

    Python和Go语言的区别总结

    Go是一种通用编程语言,由Google设计;它借鉴了许多其他许多好主意语言,同时避免导致复杂性和不可靠代码的功能。 Go支持多范式,如程序,功能和并发。它的语法传统上来自C语言,但它已经做了很多修改,以改进简单性...

    Go 语言程序设计

    8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322...

    新手程序员刷题程序-gogtd:GoGetThingsDone:一个通过实现一个简单的任务管理器来探索Go基础知识的repo(加上与函数式编程

    是在我对Haskell的一些尝试中开发出来的,目的是复习我的函数式编程。 为了重新学习我的 Haskell 技能(十年前获得,此后很少使用!)我决定选择一个介于“Hello World”和复杂的成熟操作系统之间的非平凡程序。 我...

    HaskManager:使用Haskell中的简单任务管理器示例介绍函数式编程的基础知识

    此回购源于我对Haskell所做的一些尝试,目的是为了完善我的函数式编程。 为了重新学习我的Haskell技能(十年前获得,至今很少使用!),我决定在“ Hello World”和复杂的成熟操作系统之间选择一个简单的程序。 我...

    go初级读本

    Go语言初级读本。~~~~~~~~~~ Go语言是什么? Google最近发布新型的编程语言,Go。它被设计为将现代编程语言的先进 性带入到目前仍由C语言占统治地位的系统层面。然而,这一语言 仍在试验阶段并在不断演变...

    matlab源码求一元函数-python-:Python-

    matlab源码求一元函数 ...支持面向对象和函数式编程 能够通过调用C/C++代码扩展功能 代码规范程度高,可读性强 目前几个比较流行的领域,Python都有用武之地。 云基础设施 - Python / Java / Go DevOps - Pyth

    海龟交易java源码-funcgo:函数式Go编程语言

    Go 转换为 Clojure,以在 JVM 上运行或作为 JavaScript 运行。 试试看 无需安装任何东西,您可以尝试在何处输入 Funcgo 并查看它如何转换为 Clojure 并进行评估。 (顺便说一下,在线游览本身就是一个示例 Web 应用...

    28编程范式游记(1)-起源1

    第二部分:函数式编程,第4章和第5章,讲述了函数式编程用到的技术,及其思维方式,并通过Python和Go修饰器的例子,展示了函数式编程下的代码扩展能力,以及函数

    monkey-lang:用go编写的mokney编程语言(一种伪编程语言)的解释器

    Monkey Lang是一种编程语言,旨在帮助您理解编程语言的幕后工作方式。 编译器当前支持函数,高阶函数,闭包,字符串,整数,数组,哈希和整数算术。 这是Thorsten Ball的《 中的帮助下。 :rocket: 入门 当前,该...

    photoweb:go语言照片网站,根据徐式伟《go语言编程》的例子编写

    go语言最简单模板照片上传网站 1.0 这个是最简化的go语言demo 使用了以下包中的函数 "os" "io/ioutil" "log" "net/http" "html/template" http/template 双大括号{{}}是区分模板代码和HTML的分隔符 括号里边可以是要...

    Fortran编程教材-世界顶级高校教材

    Fortran 与 C/C++属于性能第一梯队的高级编程语言,适合高性能计算的编程语言一般 无垃圾回收机制,如 C、C++、Fortran、Rust,其中 Fortran 专注于科学计算;像 Julia、Go 这类原生特点优秀或得到充分优化发展的...

    JCandy-Lang:一个简单的编程语言

    一个简单的动态类型编程语言(支持面向对象,函数式编程,闭包等特性)。自己编写的玩具脚本语言,还有很多不足和改进的地方。 建立 Candy通过Java语言编写,需要JRE(Java运行时环境)去运行Candy。Candy所需要的...

Global site tag (gtag.js) - Google Analytics