函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。
函数定义
使用一个最简单的加法函数来进行详细说明:
package main
import (
"errors"
"fmt"
)
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 // 支持多返回值
}
如果参数列表中若干个相邻的参数类型相同,比如上面例子中的a和b,则可以在参数列表中省略前面变量的类型声明,如下所示:
func Add(a, b int)(ret int, err error){
//
}
如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并。
如果一个函数只有一个返回值,也可以这么写:
func Add(a, b int) int {
//
}
函数调用函数调用非常简单,只要事先导入该函数所在的包,就可以直接按照如下方式调用函数:
import "mymath"
c := mymath.Add(1,2)注意一点,小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。这个规则也适用于类型和变量的可见性。
不定参数
不定参数是指传入的参数个数为不定数量。为了做到这点,首先需要将函数定义为接受不定参数类型:
func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}
这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int,所以它可以用如下方式调用:
myfunc(2, 3, 4)
myfunc(1, 3, 7, 13)
形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。
之前的例子中将不定参数类型约束为int,如果你希望传任意类型,可以指定类型为interface{}。下面是Go语言标准库中fmt.Printf()的函数原型:
func Printf(format string, args ...interface{}) {
//
}
以下是一个完整的例子:
// varg1
package main
import (
"fmt"
)
func MyPrintf(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 int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
func main() {
var v1 int = 1
var v2 int64 = 234
var v3 string = "hello"
var v4 float32 = 1.234
MyPrintf(v1, v2, v3, v4)
}
多返回值
Go语言中支持多返回值函数。
如果调用方调用了一个具有多返回值的方法,但是却不想关心其中的某个返回值,可以简单地用一个下划线来跳过这个返回值。
匿名函数和闭包
匿名函数是指不需要定义函数名称的一种函数实现方式。
有疑问加站长微信联系(非本文作者)