函数在 Go 语言中属于“一等公民”,拥有“一等公民”待遇的语法元素可以存储在变量中,可以作为参数传递给函数,可以在函数内部创建并可以作为返回值从函数返回。

1,函数的定义

Go 函数样式:

在这里插入图片描述

函数的变量声明形式:

在这里插入图片描述

在 Go 语言中,每个函数声明所定义的函数,仅仅是对应的函数类型的一个实例,即函数也是变量,函数名就是变量名,等号后边就是对应的函数的类型。

比如上面函数的类型就是:

func(io.Writer, string, ...interface{}) (int, error)

... 是 Go 中的变长参数变长参数是通过切片来实现的。所以,在函数体中,就可以使用切片支持的所有操作来操作变长参数

Go 语言支持函数多返回值:

func foo()                       // 无返回值
func foo() error                 // 仅有一个返回值
func foo() (int, string, error)  // 有 2 或 2 个以上返回值
func foo() func()                // 函数的返回值类型是一个函数
func foo(func())                 // 函数的参数类型是一个函数

函数返回值可以声明变量名,这种带有名字的返回值被称为具名返回值,其可以像函数体中声明的局部变量一样在函数体内使用。

Go 标准库以及大多数项目代码中的函数,都选择了使用普通的非具名返回值形式。但在一些特定场景下,具名返回值也会得到应用。

比如,当函数的返回值个数较多时,每次显式使用 return 语句时都会接一长串返回值,这时,我们用具名返回值可以让函数实现的可读性更好一些。

基于函数自定义类型

// $GOROOT/src/net/http/server.go
type HandlerFunc func(ResponseWriter, *Request)

// $GOROOT/src/sort/genzfunc.go
type visitFunc func(ast.Node) ast.Visitor

2,设计健壮函数的三原则

  • 不要相信任何外部输入的参数:对输入做合法性校验
  • 不要忽略任何一个错误:判断每一个调用的返回值
  • 不要假定异常不会发生:对可能发生异常的地方做异常处理

3,fmt.Print 函数

format 分类:

format 含义
一般类型
%v 值的默认格式,输出结构体
%+v 输出结构体显示字段名
%#v 输出结构体源代码片段
%T 输出值的类型
布尔类型
%t 输出布尔类型值
整数类型
%b 输出标准的二进制格式化
%c 输出对应的unicode码的一个字符
%d 输出标准的十进制格式化
%o 输出标准的八进制格式化
%q 要输出的值是双引号输出就是双引号字符串;另外一种是自转义的 unicode 单引号字符
%x 输出十六进制编码,字母形式为小写 a-f
%X 输出十六进制编码,字母形式为大写 A-F
%U 输出Unicode格式
浮点数与复数
%b 无小数部分、二进制指数的科学计数法
%e 科学计数法(小写e)
%E 科学计数法(小写E)
%f 十进制小数
%F 和 %f 一样
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
字符串和 []byte
%s 输出字符串
%q 源代码中那样带有双引号的输出
%x 每个字节用两字符十六进制数表示(使用a-f)
%X 每个字节用两字符十六进制数表示(使用A-F)
指针
%p 输出十六进制,并加上前导的 0x

(完。)