Go语言学习笔记(四)
一 使用函数
函数是编程的一个核心要素,在Go语言中,函数的重要性不言而喻,在学习关于函数的使用上,可以结合python
中的函数来学习,因为和python
一样,Go
也支持数量不定的参数和多个返回值(返回值列表)
1.1 函数是什么?
函数是一个接收输入产生输出或执行一定动作的元件,可以类比与数字逻辑中的芯片(74136,74147???)
1.1.1 函数的结构
这一点在之前的笔记中有提到
func <函数名> (<参数名> <参数类型>) <返回值类型>{
<函数体>
return <value>(或空)
}
这里要注意{
要和关键词func
位于同一行,如果函数声明了返回值,函数体必须用return语句结束
1.1.2 编写函数要注意什么
1.1.3 函数返回多个值
package main
import "fmt"
func getPrize()(int,string){
i := 2
s := "goldfish"
return i,s
}
func main(){
quantity, prize := getPrize()
fmt.Printf("You won %v %v\n",quantity,prize)
}
当函数返回多个值时要注意三个元素之间一一对应:
1.返回类型列表
2.返回值列表
3.调用列表
简单来说就是对应位置的类型要保持一直
1.2 定义不定参数函数
不定参数函数是指参数数量不确定的而函数。通俗地说,这意味着它们可以接受可变数量的参数。在Go语言中,能够传递可变数量的参数,但他们的类型必须与函数签名指定的类型相同。要指定不定参数,可以使用...
(注意这里不是省略号的一半,而是三个小数点,对没错,是键盘右下角的那个)、实例如下:
package main
import "fmt"
func sumNumber(numbers ...int) int {
total := 0
for _, number := range numbers {
total += number
}
return total
}
func main() {
result := sumNumber(1, 2, 3, 4)
fmt.Printf("The result is %v\n", result)
}
我觉得这里for
后面的_
是和number
联合使用的,目的是保证:=
的左边始终存在新的变量
1.3 使用具名返回值
具名返回值让函数能够在返回前将值赋给具名变量,这将助于提升函数的可读性,使其功能更明确。要使用具名返回值,可在函数签名的返回值部分指定变量名。如下:
func sayHi()(x , y string){
x = "hello"
y = "world"
return
}
这个签名指定将返回两个值,它们类型都为string
:它还制定了变量名(x和y),可以在函数体中给它们赋值。
这个函数体中,在终止语句return前给具名变量进行赋值。使用具名返回值时,无须显式地返回相应的变量。这被称为裸(naked)return语句。
package main
import "fmt"
func sayHi() (x, y string) {
x = "hello"
y = "world"
return
}
func main() {
fmt.Println(sayHi())//输出hello world
}
调用具名返回值函数时,将按声明顺序返回具名变量。这里的函数中的x,y并没有使用简短变量声明,因为在函数声明后面声明返回值的时候已经声明了x,y
func swyHi() (x,y string) {
x = "hello"
y = "world"
z := "ubu"
a := "dasad"
return z,a
}
这个函数返回的将是ubu dasad,这是因为我们显式地定义了返回值
1.4 使用递归函数
递归函数是不断调用自己直到满足特定条件的函数。要在函数中实现递归,可将 调用自己的代码 作为终止语句中的返回值。
package main
import "fmt"
func feedMe(portion int, eaten int) int {
eaten = portion + eaten
if eaten >= 5 {
fmt.Printf("I'm full! I've eaten %d\n", eaten)
return eaten
}
fmt.Printf("I'm still hungry! I've eaten %d\n", eaten)
return feedMe(portion, eaten)
}
func main() {
fmt.Println(feedMe(1, 0))
}
输出结果如下:
1.5 将函数作为值传递
Go语言提供了一些函数式编程功能,如能够将一个函数作为参数传递给其他函数(类似于C++的函数指针)。从本质上来说,Go将函数视为一种类型,因此可将函数赋给变量,以后在通过变量来调用他们。
package main
import "fmt"
func anotherFunction(f func() string)string{
return f()
}
func main(){
fn := func() string{
return "function called"
}
fmt.Println(anotherFunction(fn))
}
函数anotherFunction的签名中包含一个子函数签名,这表明这个参数是一个返回字符串的函数。接受函数依然需要声明其返回类型,它可以是任何类型,但这里是字符串。
参考书籍
[1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译
题外话
- 高产的一天,这本书关于Go语言的讲解有些浅只能这么说