本章知识点:

■   fmt.Printf 和 fmt.Sprintf 函数格式化给定的值。第一个参数应该是一个包含动词(%d、%f、%s 等)的格式化字符串,其值将被替换。
■  在格式化动词中,可以包含宽度:格式化值将占用的最小字符数。例如,%12s 的结果是一个 12 个字符的字符串(用空格填充),%2d 的结果是一个 2 个字符的整数,%.3f 的结果是一个四舍五入到小数点后 3 位的浮点数。
■  如果希望调用函数来接受参数,必须在函数声明中声明一个或多个参数,包括每个参数的类型。所传递的参数的数量和类型必须始终与规定的参数的数量和类型相匹配,否则将出现编译错误。
■  如果希望函数返回一个或多个值,则必须在函数声明中声明返回值的类型。
■  不能在函数的外部访问在该函数内声明的变量。但是你可以在函数内访问在该函数外部声明的变量(通常在包级别)。
■  当函数返回多个值时,最后一个值通常具有一个 error 类型。错误值有一个 Error()方法,该方法返回描述错误的字符串。
■  按照惯例,函数返回一个错误值 nil,表示没有错误。
■  你可以通过在指针前面加一个*来访问指针所保留的值:*myPointer。
■  如果函数接收一个指针作为参数,并更新该指针处的值,那么更新后的值在函数外部仍然可见。

fmt.Printf 常用动词如下

函数声明

一个简单的函数声明看起来是这样的:

函数名的规则与变量名的规则相同:

  • 名称必须以字母开头,后跟任何数量的附加字母和数字。(如果违反此规则,将出现编译错误。)
  • 名称以大写字母开头的函数是可导出的,并且可以在当前包之外使用。如果只需要在当前包中使用函数,则应该以小写字母开头。
  • 包含多个单词的名称应该使用驼峰式大小写。

函数多个返回值

要声明函数的多个返回值,需将返回值类型放在函数声明的第二组圆括号中(在函数参数的圆括号之后),用逗号分隔。(当只有一个返回值时,返回值周围的圆括号是可选的,但如果有多个返回值,则必须使用圆括号。)

函数值传递

当你调用一个声明了形参的函数时,你需要为调用提供实参。每个实参中的值被复制到相应的形参变量。
执行此操作的编程语言有时称为“值传递”。

如果你想把一个变量的值传递给一个函数并让它以某种方式改变这个值,你就会遇到麻烦。函数只能更改形参中的该值的副本,而不能更改原始值。
因此,在函数内部所做的任何更改在函数外部都将不可见!

因为,Go 是一种“值传递”语言;函数形参从函数调用中接收实参的副本。

指针

表示变量地址的值称为指针,因为它指向可以找到变量的位置。
你可以使用一个&符号获取变量的地址,它是 Go 的“地址”运算符。

指针类型

指针的类型可以写为一个符号,后面跟着指针指向的变量的类型。
例如,指向一个 int 变量的指针的类型将被写为
int

我们可以声明保存指针的变量。指针变量只能保存指向一种类型值的指针,因此变量可能只保存int指针,只保存float64指针,依此类推。

如果要立即为指针变量赋值,可以使用短变量声明:

函数指针

可以从函数返回指针,只需声明函数的返回类型是指针类型。

在Go中,返回一个指向函数局部变量的指针是可以的。即使该变量不在作用域内,只要你仍然拥有指针,Go将确保你仍然可以访问该值。

你还可以将指针作为参数传递给函数。只需说明一个或多个参数的类型应该是指针。