Golang语言社区--Go语言基础第六节函数
大家好,我是Golang语言社区主编彬哥,本篇给大家带来的是关于Go语言中的函数。
函数定义
函数声明语句:
function 函数名(参数列表) (返回值列表) {
// 函数体
}
注意:
1、 参数列表和返回值列表都是变量名在前,变量类型在后;
2、 Go函数支持多返回值,但并不是所有返回值都必须赋值,在函数返回时没有被明确赋值的返回值都会被设置为默认值。
3、 函数左起的花括号”{”不能另起一行,否则会报错;
以一个简单的计算加法的函数为例:
func add(a int, b int) (ret int, err error) {
if a<0 || b<0 { // 假设这个函数只支持两个非负数的加法
err = errors.New("Should be non-negative numbers!")
return
}
return a+b, nil
}
如果参数列表中若干个相邻的参数类型相同,则可以在参数列表中省略前面变量的类型声明,例如:
func add(a, b int) (ret int, err error) {
...
}
如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并;另外,如果函数只有一个返回值,可以这样写:
func Add(a, b int) int {
...
}
Go语言支持多重赋值,比如:
i, j = j, i
用于交换两个变量的值,在不支持多重赋值的语言中,交换两个变量的内容需要引入一个临时变量:
t = i; i = j; j = t
Go函数带回多个返回值时,可以使用多重赋值语句,将不同的返回值赋值给不同的变量,并且允许使用匿名变量("_")接受不需要使用的返回值,例如:
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
_, _, nickName := GetName
函数调用
函数调用非常方便,只要事先导入该函数所在的包,就可以调用了:
import "mymath"
c := mymath.Add(1,2)
注意:小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其它包使用。
不定参数
例如:
func foo(args ...int) { // 接受不定数量的参数,这些参数都是int类型
for _, arg := range args {
fmt.Println(arg)
}
}
foo(2,3,4)
foo(1,3,7,13)
形如"...type"格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。
"...type"本质上是一个数组切片,也就是[]type,这也是为什么上面的参数args可以用for循环来获得每个传入的参数。
如果希望不定参数传任意类型,可以指定类型为interface{},如标准库中的fmt.Printf()的函数原型:
func Printf(format string, args ...interface{}) {
...
}
例如:
func foo(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case float32:
fmt.Println(arg, "is a float32 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
匿名函数与闭包
匿名函数可以直接赋值给一个变量,例如:
f := func(x, y int) int {
return x+y
}
或者直接执行一个匿名函数:
func(ch chan int) {
ch <- ACK
} (reply_chan) // 花括号后面直接跟参数列表表示函数调用
闭包:当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部函数的局部变量。
a := func() (func()) {
var i int = 10
return func(){
fmt.Printf("i=%dn", i)
i++
}
}
c1 := a()
c2 := a()
c1() // 10
c1() // 11
c1() // 12
c2() // 10
c1和c2是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring之为级联集合属性进行赋值
- springmvc之HiddenHttpMethodFilter配置使用POST、GET、DELETE、PUT请求
- springmvc之使用@RequestParam绑定请求参数
- hadoop完全分布式之集群分发脚本
- 牛逼!9种方法让你访问Github提速到2MB/s!
- pyhton之如何将类的属性和方法设置成私有类型
- 【colab pytorch】查看gpu、cuda、cudnn信息
- 【colab pytorch】设置随机种子
- (三)django--带Template的网站
- spring之IOC(控制反转)和DI(依赖注入)
- 【colab pytorch】指定使用的显卡
- Python自学成才之路 迭代器的使用
- 回溯法--全排列
- 【colab pytorch】张量操作
- 『开发技巧』python :与-> 操作来给函数参数增加元信息