第 9 章 函数
函数 是基于功能或逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性。由于 Go 语言是编译型语言,所以函数编写的顺序是无关紧要的。
9.1 函数的声明
在 Go 语言中,函数声明语法如下:
1 2 3
| func function_name(parameter_list) (result_list) { }
|
函数的声明使用 func
关键词,后面依次接 function_name(函数名)
, parameter_list(参数列表)
, result_list(返回值列表)
以及 函数体
。
- 形式参数列表:函数的参数名以及参数类型,这些参数作为局部变量,其值由参数调用者提供,函数中的参数列表和返回值并非是必须的。
- 返回值列表:函数返回值的变量名以及类型,如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。
- 如果有连续若干个参数的类型一致,那么只需在最后一个参数后添加该类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package main
import "fmt"
func sum(x int, y int) int { return x + y }
func printBookName() { fmt.Println("《Go语言极简一本通》") }
func sub(x , y int) int { return x - y }
func main() { fmt.Println("56 + 1 = ", sum(56, 1)) printBookName() fmt.Println("58 - 2 =", sub(58, 2)) }
|
9.2 可变参数
上面的程序参数个数都是固定的,在 Go 语言 中也可以使用可变参数的函数。
9.2.1 多个类型一致的参数
在参数类型前面加 ...
表示一个切片,用来接收调用者传入的参数。注意,如果该函数下有其他类型的参数,这些其他参数必须放在参数列表的前面,切片必须放在最后。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package main
import "fmt"
func show(args ...string) int { sum := 0 for _, item := range args { fmt.Println(item) sum += 1 } return sum }
func main() { fmt.Println(show("Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师")) }
|
9.2.2 多个类型不一致的参数
如果传多个参数的类型都不一样,可以指定类型为 ...interface{}
,然后再遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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(57, 3.14, "从0到Go语言微服务架构师") }
|
9.3 解序列
使用 ...
可以用来解序列,能将函数的可变参数(即切片)一个一个取出来,传递给另一个可变参数的函数,而不是传递可变参数变量本身。
1 2 3 4 5 6 7 8 9
| package main
import "fmt"
func main() { var s []string s = append(s, []string{"Go语言极简一本通", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"}...) fmt.Println(s) }
|
9.4 函数的返回值
当函数没有返回值时,函数体可以使用 return
语句返回。在 Go 中一个函数可以返回多个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import "fmt"
func showBookInfo(bookName, authorName string) (string, error) { if bookName == "" { return "", errors.New("图书名称为空") } if authorName == "" { return "", errors.New("作者名称为空") } return bookName + ",作者:" + authorName, nil }
func main() { bookInfo, err := showBookInfo("《Go语言极简一本通》", "欢喜") fmt.Printf("bookInfo = %s, err = %v", bookInfo, err) }
|
当然,在 Go 中支持返回带有变量名的值。可以将上面的函数修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| func showBookInfo2(bookName, authorName string) (info string, err error) { info = "" if bookName == "" { err = errors.New("图书名称为空") return } if authorName == "" { err = errors.New("作者名称为空") return } info = bookName + ",作者:" + authorName return }
|
9.5 匿名函数
没有名字的函数就叫 匿名函数 ,它只有函数逻辑体,而没有函数名。匿名函数只拥有短暂的生命,一般都是定义后立即使用。
1 2 3
| func (parameter_list) (result_list) { body }
|
9.6 内部方法与外部方法
在 Go 语言中,函数名通过首字母大小写实现控制对方法的访问权限。
- 当方法的首字母为 大写 时,这个方法对于 所有包 都是 Public ,其他包可以随意调用。
- 当方法的首字母为 小写 时,这个方法是 Private ,其他包是无法访问的。
如何学习Go语言微服务,快速步入架构师
添加微信 |
公众号更多内容 |
 |
 |