【GoLang】2.3 函数
文章目录
- 基本语法
- 多返回值
- 一等公民
- 匿名函数
- 可变参数
- 返回值命名
- init函数
- 注意事项
基本语法
GoLang的函数声明,返回类型写在最后,确实不符合我以前的习惯,因为我C和Java用得多,这两种语言,返回类型都是写在函数/方法名前面的,不过不习惯也得练习适应啊。
package mainimport "fmt"func main() {fmt.Println(cubic(3))
}func cubic(x rune) rune {return x * x * x
}
执行结果:
27
所以可以总结下函数的声明就是这么几部分组成:
- func关键字
- 函数名
- 参数列表
- 返回值列表
- 函数体
多返回值
多返回值,我在python里已经体验过了,但是Python的多返回值是将返回值包装为元组,如果拿多个变量来接,就把元组拆开,再赋值到多个变量。Go的多返回值函数,是必须得全部接全部返回值,如果不需要用那么多返回值,就需要用下划线来占位,如。
package mainimport "fmt"func main() {a, _ := divmod(7, 3)fmt.Println(a)
}func divmod(x rune, y rune) (rune, rune) {return x / y, x % y
}
输出:
2
一等公民
在Go里函数是一等公民,是一个特殊的类型。最明显的是可以将一个变量定义为函数类型,这样程序的灵活性大大提高,或者说将函数赋值给一个变量。我举个例子,我用一个函数产生抛物线函数,然后调用抛物线函数:
package mainimport "fmt"func main() {fun := parabola(3, 4, 5)fmt.Println(fun(3))
}func parabola(a rune, b rune, c rune) func(rune) rune {return func(x rune) rune {return a*x*x + b*x + c}
}
上述代码执行结果为:
44
匿名函数
其实上面的例子里已经有了匿名函数了。上例的匿名函数是在函数体内定义的。能否在包下定义呢?是可以的,但是只能定义为变量,不能定义为常量,如:
package mainimport "fmt"var porabola = func(x rune) rune {return 3*x*x + 4*x + 5
}func main() {fmt.Println(porabola(6))
}
执行结果:
137
其实我还忘了介绍匿名函数的一个特性,就是匿名函数如果在函数体内定义,可以直接调用局部变量,并且可以修改局部变量的值。这点和java不一样,java的匿名内部类和lambda表达式是不能修改局部变量的值的。对于GoLang的这点,我举个例子:
package mainimport "fmt"func main() {x := 1increment := func() {x++}increment()fmt.Println(x)
}
执行以后,输出为2,说明x已经加1了。
可变参数
许多编程语言有变长参数,最明显的是C语言的printf函数,java也有三个点号的函数定义。而Python就更复杂了,有两种形式的,*args和**kwargs。在GoLang中,这类函数叫Variadic Functions,fmt包下的Println就是这样的函数。这样的函数我们也可以写一个练练,不过需要提前学习下for循环语法了。我是写了一个连乘函数练手哈:
package mainimport "fmt"func main() {fmt.Println(prod(3, 4, 5, 6, 7))
}func prod(vars ...rune) rune {var p rune = 1for _, v := range vars {p *= v}return p
}
输出结果:
2520
返回值命名
这是goLang语言特殊的地方,其他的编程语言,函数或方法定义返回值的时候只需要定义类型就可以了。GoLang也可以只定义返回值的类型,但是GoLang可以同时定义返回值的变量名。指定了变量名,那就意味着定义了变量,同时也意味着函数返回时只需要一个简单的return,return关键字后不需要再加任何变量了。我举个例子:
package mainimport "fmt"func main() {fmt.Println(multiply(3, 5))
}func multiply(a rune, b rune) (c rune) {c = a * breturn
}
输出结果是15,因为在返回值列表里已经定义了返回值变量,所以return后面什么都不用写。但是这个return能不能省略呢?这是不可以的!会报语法错误。
init函数
init函数和main函数应该一起讲的,但是main函数大家已经很熟悉了,所以只需要单独说说init函数,init函数在go文件里会在main函数之前执行,如以下例子:
package mainimport "fmt"func init() {fmt.Println("init")
}func main() {fmt.Println("Hello, world!")
}
输出结果为:
init
Hello, world!
确实验证了init在main函数之前执行。
注意事项
- 在学JSON那里我们会看到只有首字母大写的字段才能JSON序列化和反序列化。这是GoLang的做法,首字母大写的才是公有的,才能被其他包访问到,函数也是一样,如果希望函数被其他包调用,首字母应当大写。
- GoLang的函数不支持重载。
【GoLang】2.3 函数相关推荐
- Golang面向过程编程-函数
Golang面向过程编程-函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字,所有的 ...
- golang的new函数_new()和make()函数以及Golang中的示例
golang的new函数 In Golang, to allocate memory, we have two built-in functions new() and make(). 在Golang ...
- GoLang之init函数
文章目录 GoLang之init函数 1.init函数特性 2.init函数执行顺序 3.init函数使用场景 GoLang之init函数 注:本文基于Go SDK v1.8进行讲解 1.init函数 ...
- Golang 内置函数
Golang中内置了一些函数,在使用这些函数时,不必以包名为前缀来调用,而是直接写函数名即可调用,这些函数都是一些基础的函数,在程序设计中应用比较普遍,所以一定要牢记这些最基本的函数用法.下边来介绍一 ...
- golang的闭包函数理解
golang中在函数中不能声明一个函数,但是可以在函数中声明匿名函数,统称闭包. 最开始接触golang时,对这一块不是特别理解,通过以下代码进行了解: 函数返回是个func()函数,返回的就是闭包函 ...
- 视频教程-桫哥-GOlang基础-02函数-Go语言
桫哥-GOlang基础-02函数 多年互联网从业经验: 有丰富的的企业网站.手游.APP开发经验: 曾担任上海益盟软件技术股份有限公司项目经理及产品经理: 参与项目有益盟私募工厂.睿妙影音家庭物联网设 ...
- 实现一个Golang的reverse函数
Reverse函数,用来反转列表,本例子用golang实现,反转一个slice列表. 因为slice是引用类型,因此直接修改参数的值即可. func myReverse(l []string) {fo ...
- GoLang strings包函数用法
package main import ( "fmt" "strings" //"unicode/utf8" ) func main() { ...
- 【源码阅读】【苦练基本功】Golang内置函数分析
Golang package builtin 中内置函数我分为两部分介绍,第一部分为基础类型,第二部分为包含函数.接口,较复杂一些 第一部分 // bool is the set of boolean ...
- 实现golang中memset函数
C语言中的memset 在C/C++中,有一个memset函数,常常用来清空一段内存. #include <string.h> // 将s的前n个字节用c填充 void *memset(v ...
最新文章
- 一个分析“文件夹”选择框实现方法的过程
- 2021年春季学期-信号与系统-第一次作业参考答案-第三题
- 管理系统状态栏和导航栏(翻译)
- python 计时_python怎么实现计时
- 桥接模式下的手机-电脑-开发板连接
- flush mysql_请教一下,mysql什么时候需要flush privileges?
- PostgreSQL学习总结(6)—— PostgreSQL 模式(SCHEMA)详解
- openCVPracticalExercise学习笔记01
- Git:查看所有远程分支以及同步远程代码
- Flexbox 布局教程
- html点击文本框唤醒手机键盘,html移动应用 input 标签 清除按钮功能如何实现(不触发键盘)...
- Spss典型相关分析的常见问题
- 使用原始武器的现代战争
- 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
- 4年Java经验面试总结(转)
- 关于我——人工智能专业大二的一年
- Apache 基金会创始成员访谈录 ———— 回顾 Apache 20年历程!
- 《Android》Chap.11 网络技术
- 【北京迅为】i.MX6ULL终结者GPIO时钟
- JavaScript:替换原段落中的文字并将其变成红色