一 使用函数
1.1 函数是什么?
1.1.1 函数的结构
1.1.2 编写函数要注意什么
1.1.3 函数返回多个值
1.2 定义不定参数函数
1.3 使用具名返回值
1.4 使用递归函数
1.5 将函数作为值传递
题外话
一 使用函数 函数是编程的一个核心要素,在Go语言中,函数的重要性不言而喻,在学习关于函数的使用上,可以结合python中的函数来学习,因为和python一样,Go也支持数量不定的参数和多个返回值(返回值列表)
1.1 函数是什么? 函数是一个接收输入产生输出或执行一定动作的元件,可以类比与数字逻辑中的芯片(74136,74147???)
1.1.1 函数的结构 这一点在之前的笔记中有提到
func <函数名> (<参数名> <参数类型>) <返回值类型>{
<函数体>
return <value>(或空)
}
1 2 3 4 这里要注意{要和关键词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 4 5 6 7 8 9 10 11 12 13 14 当函数返回多个值时要注意三个元素之间一一对应: 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) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 我觉得这里for后面的_是和number联合使用的,目的是保证:=的左边始终存在新的变量
1.3 使用具名返回值 具名返回值让函数能够在返回前将值赋给具名变量,这将助于提升函数的可读性,使其功能更明确。要使用具名返回值,可在函数签名的返回值部分指定变量名。如下:
func sayHi()(x , y string){ x = "hello" y = "world" return } 1 2 3 4 5 这个签名指定将返回两个值,它们类型都为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 } 1 2 3 4 5 6 7 8 9 10 调用具名返回值函数时,将按声明顺序返回具名变量。这里的函数中的x,y并没有使用简短变量声明,因为在函数声明后面声明返回值的时候已经声明了x,y
func swyHi() (x,y string) { x = "hello" y = "world" z := "ubu" a := "dasad" return z,a } 1 2 3 4 5 6 7 这个函数返回的将是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 2 3 4 5 6 7 8 9 10 11 12 13 14 输出结果如下:
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)) } 1 2 3 4 5 6 7 8 9 10 11 函数anotherFunction的签名中包含一个子函数签名,这表明这个参数是一个返回字符串的函数。接受函数依然需要声明其返回类型,它可以是任何类型,但这里是字符串。
参考书籍 [1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译 CSDN