打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Go 语言系列15:函数

函数 是基于功能或逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性。由于 Go 语言是编译型语言,所以函数编写的顺序是无关紧要的。

函数的声明

在 Go 语言中,函数声明语法如下:

func function_name(parameter_list) (result_list) {
    body
}

函数的声明使用 func 关键词,后面依次接 function_name(函数名)parameter_list(参数列表)result_list(返回值列表) 以及 函数体

  • 形式参数列表描述了函数的参数名以及参数类型,这些参数作为局部变量,其值由参数调用者提供,函数中的参数列表和返回值并非是必须的。
  • 返回值列表描述了函数返回值的变量名以及类型,如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。
  • 如果有连续若干个参数的类型一致,那么只需在最后一个参数后添加该类型。
package main

import "fmt"

// 函数返回一个无名变量,返回值列表的括号省略
func sum(x int, y int) int {
 return x + y
}

// 无参数列表和返回值
func printHello() {
 fmt.Println("Hello")
}

// 参数的类型一致,只在最后一个参数后添加该类型
func sub(x , y int) int {
 return x - y
}

func main() {
 fmt.Println("3 + 4 =", sum(34))
 printHello()
 fmt.Println("5 - 2 =", sub(52))
}

运行该程序输出如下:

3 + 4 = 7
Hello
5 - 2 = 3


可变参数

上面的程序参数个数都是固定的,在 Go 中我们也能像 Python 中一样实现可变参数的函数。

多个类型一致的参数

在参数类型前面加 ... 表示一个切片,用来接收调用者传入的参数。注意,如果该函数下有其他类型的参数,这些其他参数必须放在参数列表的前面,切片必须放在最后。

package main

import "fmt"

func sum(args ...int) int {
 sum := 0
 for _,x := range args{
  sum += x
 }
 return sum
}

func main() {
 fmt.Println(sum(34567)) // 25
}

多个类型不一致的参数

如果传多个参数的类型都不一样,可以指定类型为 ...interface{} ,然后再遍历。

package main

import "fmt"

func PrintType(args ...interface{}) {
 for _, arg := range args {
  switch arg.(type) {
  case int:
   fmt.Println(arg, "type is int.")
  case string:
   fmt.Println(arg, "type is string.")
  case float64:
   fmt.Println(arg, "type is float64.")
  default:
   fmt.Println(arg, "is an unknown type.")
  }
 }
}

func main() {
 PrintType(13.14"abc")
}

运行上面的程序输出如下:

type is int.
3.14 type is float64.
abc type is string.


解序列

使用 ... 可以用来解序列,能将函数的可变参数(即切片)一个一个取出来,传递给另一个可变参数的函数,而不是传递可变参数变量本身。

package main

import "fmt"

func sum(args ...int) int {
 res := 0
 for _,value := range args {
  res += value
 }
 return res
}

func Sum(args ...int) int {
 return sum(args...)
}

func main() {
 fmt.Println(Sum(456))   // 15
}


函数的返回值

当函数没有返回值时,函数体可以使用 return 语句返回。在 Go 中一个函数可以返回多个值。

package main

import "fmt"

func RectInfo(len, width int) (intint) {
 per := 2 * (len + width)
 area := len * width
 return area, per
}

func main() {
 area, perimeter := RectInfo(105)
 fmt.Printf("area = %d, perimeter = %d", area, perimeter)
}

运行该程序输出如下:

area = 50, perimeter = 30

当然,在 Go 中支持返回带有变量名的值。可以将上面的函数修改如下:

func RectInfo(len, width int) (area int, perimeter int) {
    // 不使用 := 因为已经在返回值那里声明了
 area = len * width
 perimeter = 2 * (len + width)
    // 直接返回即可
 return
}


匿名函数

没有名字的函数就叫 匿名函数 ,它只有函数逻辑体,而没有函数名。匿名函数只拥有短暂的生命,一般都是定义后立即使用。

func (parameter_list) (result_list) {
    body
}

参考文献:

[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.

👇周一至周五更新,期待你的关注👇

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
2020 重学 Go 系列:09. 一篇文章理解 Go 里的函数
函数定义
函数,多返回值,变参函数
Golang学习之路(五):Golang的函数
Golang极简入门教程(一):基本概念
【基础篇】Python+Go——带大家一起另寻途径提高计算性能
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服