zoukankan      html  css  js  c++  java
  • Go从入门到精通——使用函数

    使用函数

    本章介绍如下内容

    • 函数是什么
    • 定义不定参数函数
    • 使用具名函数
    • 使用递归函数
    • 将函数作为值传递

      函数是另一个核心要素,不仅仅是 Go 语言,在日常编程中亦是如此。

    1.1 函数是什么?

      简单地说,函数接受输入并返回输出。数据流经过函数时,将被变换。一个典型的示例是将两个数相加的简单函数,它接受两个数字,将它们相加并返回结果。

    func addUp(x int,y int) int{
        return x + y
    }
    

      1.1.1 函数的结构

      在 Go 语言中,函数向编译器和程序员提供了有关的信息,这些信息指出了函数将接受什么样的输入并提供什么样的输出。这种信息是在函数的第一行中提供的,而这一行被称为函数签名。我们再以函数 addUp 为例,阐述 Go 语言中函数的结构是什么样的。

    func addUp(x int,y int) int{
        return x + y
    }
    

      关键字 func 指出这是一个函数的开头位置。接下来是函数名,这是可选的,但能够让您在其他地方调用(或使用)这个函数。接下来是一对括号,指出了函数接受什么样的值,在这里,是两个类型为 int 的值(带符号的整数,长度至少为 32 位)。在右括号后面是返回值,这里也是一个类型为 int 的值。左括号表示接下来为函数体,函数体以右括号结束。如果函数签名声明了返回值,则函数体必须以终止语句结束。通常有一个返回值,但并非总是如此。

      1.1.2 返回单个值

    package main
    
    import (
    	"fmt"
    )
    
    func isEven(i int) bool {
    	return i%2 == 0
    }
    
    func main() {
    	fmt.Printf("%v
    ", isEven(1))
    
    	fmt.Printf("%v
    ", isEven(2))
    
    }
    

      要调用函数,可通过名称来对其进行引用,并提供所需的参数。调用了函数 isEven 两次,并将结果打印到终端。对函数调用次数没有任何限制。

       1.1.3 返回多个值

      在 Go 语言中,可在函数签名中声明多个返回值,让函数返回多个结果。在这种情况下,终止语句可返回多个值。在下面的例子中,函数签名指出函数不接受任何参数,并返回一个整数和一个字符串。在函数体中,return 语句返回了多个用逗号分隔的值。

    func getPrize() (int, string) {
        i :=2
        s := "goldfish"
        return i, s
    }

      调用这个函数时,可直接将返回值赋给变量并使用它们。

    func main(){
        quantity, prize := getPrize()
        fmt.Printf("You won %v %v
    ", quantity, prize)
    }

      程序清单:演示了一个返回多个结果的函数

    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
    ", quantity, prize)
    }
    

    1.2 定义不定参数函数

      不定参数函数是参数数量不确定的函数。通俗地说,这意味着它们接受可变数量的参数。在 Go 语言中,能够传递可变数量的参数,但它们的类型必须与函数签名指定的类型相同。要指定不定参数,可使用 3 个点(...)。在下面的示例中,函数签名指定函数可接受任意数量的 int 参数。

    func sumNumbers(numbers...int) int{
    }
    

      这个函数可接受一个或多个整数,您可使用它来计算任意多个整数的和并返回单个整数。在这个函数中,变量 numbers 是一个包含所有参数的切片。

    func sumNumbers(numbers...int) int {
    	total := 0 
    	for _, nmuber :=range numbers {
    		total += numbers
    	}
    	return total
    }
    

      您可使用这个函数来计算一系列整数的和。

    func main(){
    	result := sumNumbers(1,2,3,4)
    	fmt.Printf("The result is  %v
    ",result)
    }
    

      程序清单:使用了一个不定参数函数来将多个整数相加。

    package main
    
    import "fmt"
    
    func sumNumbers(numbers ...int) int {
    	total := 0
    	for _, number := range numbers {
    		total += number
    	}
    	return total
    }
    
    func main() {
    	result := sumNumbers(1, 2, 3, 4)
    	fmt.Printf("The result is  %v
    ", result)
    }

     1.3 使用具名返回值

      具名返回值让函数能够在返回前将值赋给具名变量,这有助于提升函数的可读性,使其功能更加明确。要使用具名返回值,可在函数签名的返回值部分指定变量名。

    func sayHi()(x,y string){}
    

      这个签名指定将返回两个值,它们的类型都为 string;它还指定了变量名(x 和 y),可在函数体中给它们赋值。

    func sayHi() (x,y string){
    	x = "hello"
    	y = "world"
    	return
    }
    

      这个函数体中,在终止语句 return 前给具名变量进行了赋值。使用具名返回值时,无须显式地返回相应的变量。这被称为裸 return 语句。

    func main(){
        fmt.Println(sayHi())
    }
    

      调用这个函数时,将按声明顺序返回具名变量。

      程序清单:具名返回值

    package main
    
    import "fmt"
    
    func sayHi() (x, y string) {
    	x = "hello"
    	y = "World"
    	return
    }
    
    func main() {
    	fmt.Println(sayHi())
    
    }
    

    1.4 使用递归函数

      递归函数是不断调用自己直到满足特定条件的函数。要在函数中实现递归,可将调用自己的代码作为终止语句中的返回值。

      程序清单:演示一个不断调用自己直到满足特定条件的函数。

    package main
    
    import "fmt"
    
    func feedMe(portion int, eaten int) int {
    	eaten = portion + eaten
    	if eaten >= 5 {
    		fmt.Printf("I'n full! I've eaten %d
    ", eaten)
    		return eaten
    	}
    	fmt.Printf("portion:%v,eaten: %v   ", portion, eaten)
    	fmt.Printf("I'm still hungry! I've eaten %d
    ", eaten)
    	return feedMe(portion, eaten)
    }
    
    func main() {
    	feedMe(1, 0)
    
    }

     1.5 将函数作为值传递

      Go 语言提供了一些函数式的编程功能,如能够将一个函数作为参数传递给其他函数。Go 将函数视为一种类型,因此可将函数赋给变量,以后再通过变量来调用它们。

    func main(){
        fn := func() {
            fmt.Println("function called")
        }
    }
    • 使用简短变量赋值运算符将一个函数赋给了变量 fn。
    • 声明这个函数并将其定义为打印一行文本,让您知道它被调用了。
    • 在变量名 fn 后使用 () 调用这个函数。

      在 Go 语言中,函数是一种类型,因此可将其传递给其他函数。我们对前一个示例进行扩展,将变量 fn 传递给一个函数,并在这个函数中调用它。

      程序清单:将函数作为参数传递

    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 的签名中包含一个子函数签名,这表明这个参数是一个返回字符串的函数。接受函数依然需要声明其返回类型,它可以是任何类型,但这里也是字符串。

    Go 语言中自定义函数要注意以下几点写法:

    • 以关键字 func 开头自定义一个函数。
    • 函数的名字与变量命名的要求基本一致。
    • 函数后面的圆括号中定义了本函数接受的各个参数及其类型。
    • 如果函数有返回值,在函数圆括号后应标明返回值的类型。
    • 函数内部的所有代码应包含在一个花括号(大括号)中。
    • 如果函数有返回值,必须至少有一条 return 语句来返回结果值,每一个 return 语句都是该函数代码执行的终点,意味着 return 语句返回结果值后将不再往下执行其他代码。
    • 如果函数没有返回值,也可以用不带返回值的 return 语句来返回(强制终止函数的运行)。 
  • 相关阅读:
    笔记:Oracle查询重复数据并删除,只保留一条记录
    64位系统安装ODBC驱动的方法
    批量Excel数据导入Oracle数据库
    Oracle自我补充之Decode()函数使用介绍
    解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
    Linux命令区
    Linux下安装PHP+Nginx+Msql
    Thinkphp时间转换与统计的问题
    phpStydy配置memcache扩展
    Thinkphp+Nginx(PHPstudy)下报的404错误,403错误解决
  • 原文地址:https://www.cnblogs.com/zuoyang/p/15147770.html
Copyright © 2011-2022 走看看