前面的例子,我们使用了很多函数,为了不让你惊慌,决定先讲一点儿 go 语言函数的基本知识,后面的章节还要深入讲解。
函数在程序设计里翻译为功能为合适,就像数学里的 y=f(x),如果没有函数,所有的代码都要写在 main 里面,不但无法使用现成的功能,还会造成臃肿不可维护(同样的任务不可能写两遍重复的代码),所以函数的作用就是组织代码和实现功能重用。
函数在任务上应该单一,一个函数只做好一件事即可。go 语言的函数由 func 关键字开始申明,完整的函数包含函数名称、参数列表、返回值、函数体。如果一个函数没有参数,也没有返回值,就只剩下函数名和函数体了。
func doNothing() {
// 函数体
}
不过函数也可以匿名,也就没有没有函数名称,或者把函数赋值给一个变量。
// 直接调用一个匿名函数
func anonymous() {
func() {
fmt.Println("i am anonymous function")
}() // 注意这个括号
}
func holdFuncWithVar() {
// 把函数复制给一个变量
f := func(name string) {
fmt.Printf("hey, %s\n", name)
}
// 显示 func(string)
// fmt.Printf("%T", f)
f("zhangsan")
}
下面是一个有参数和返回值的函数,函数的返回结果使用 return 来表示。
// 函数有返回值
func incNumber(in int) int {
return in + 1
}
go 的函数也可以有多个返回值。
// 函数有多个返回值
func swapStr(s1, s2 string) (string, string) {
return s2, s1
}
函数的参数可以有一个不定参数,不过它必须是参数列表最后一个,我们用的 fmt.Println 的参数就是不定参数(F12 去看看)。
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
返回值申明一个具体的变量,这样返回的时候就只写 return 就可以了。
// more 是不定参数,result 是返回变量
func sumAllWithInitial(initial int, more ...int) (result int) {
result = initial
// 循环读取 more 参数,以后会学习
for _, num := range more {
result = result + num
}
// 等效于 return result
return
}
go 有很多内置的函数,比如 len、copy、append 等等。
func builtInFunc() {
str := "english中文"
// len 是一个内置函数
// 对于 string 它返回字节
fmt.Println(len(str)) // 返回 13,因为 1 个中文 UTF-8 这里存储占 3 个字节
}
关于函数还有很多重要的知识点,目前暂且知道这么多,第 8 小节再深入学习,下一章学习语言的控制结构。
本章节的代码