函数

Printf

Printf的第一个参数是一个字符串,用于格式化输出。它的大部分格式与字符串中显示的格式完全相同。但是,任何百分号(%)都将被视为格式化动词的开始,字符串的一部分将被特定格式的值所替换。其余的参数用作这些动词的值。

百分号后面的字母表示要使用哪个动词。最常见的动词是:

image-20201025225140557

package main
import "fmt"
func main() {
	fmt.Printf("a float %f\n",3.14)
	fmt.Printf("an intger %d\n",3)
	fmt.Printf("a string %s\n","Hello")
	fmt.Printf("a bool %t\n",true)
	fmt.Printf("values:%v %v %v\n",123,"\t",true)
	fmt.Printf("Values:%T %T %T\n",123,"\t",true)
	fmt.Printf("Percevt sign: %%\n")
}

image-20201025133812656

特别指出%#v格式化动词。因为它以Go代码中的显示方式而不是通常的显示方式来打印值,%#v可以显示一些值,如果不使用%#v的话,这些值可能会在输出中被隐藏,例如,在这段代码中,%#v显示了一个空字符串、一个制表符和一个换行符,所有这些在用%v打印时都是不可见的。在本书的后面,我们将更多地使用%#v!

image-20201025133950639


声明自己的函数

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

    image-20201025134146147

    声明以func关键字开头,后跟希望函数具有的名称、一对圆括(),然后是包含函数代码的块。


  • 一旦声明了一个函数,你就可以在包的其他地方调用它

    输入它的名称,后面跟着一对圆括号。当你执行此操作时,函数块中的代码将会运行。

    package main
    import "fmt"
    func sayHi()  {
    	fmt.Printf("Hi")
    }
    func main() {
    	sayHi()
    }

    image-20201025134612930


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

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

    image-20201025141229752

    image-20201025141244690


声明函数参数

  • 如果希望对函数的调用包含参数,则需要声明一个或多个参数。参数是函数的局部变量,其值是在调用函数时设置的。

  • 你可以在函数声明中的圆括号之间声明一个或多个参数,用逗号分隔。与任何变量一样,你需要为声明的每个参数提供一个名称,后面跟着一个类型(float64、bool等)。

  • 如果函数定义了参数,那么在调用它时需要传递一组匹配的参数。当函数运行时,每个参数都将被设置为对应参数中值的副本。然后这些参数值在函数块的代码中被使用。

    image-20201025141432605

  • 参数是函数的局部变量,其值在调用函数时被设置。


函数和变量的作用域

  • 条件块和循环块一样,函数块中声明的变量只在该函数块的作用域内。因此,如果我们试图从paintNeeded函数的外部访问area变量,我们会收到一个编译错误:

  • 但是,与条件块和循环块一样,在函数块外部声明的变量将在该函数块的作用域内。这意味着我们可以在包级别上声明一个变量,并且可以在该包中的任何函数内访问它。


函数返回值

函数总是返回特定类型的值(并且只返回该类型)。若要声明函数返回值,请在函数声明中的参数后面添加该返回值的类型。然后在函数块中使用return关键字,后面跟着要返回的值。

image-20201025143527130

然后,函数的调用者可以将返回值分配给一个变量,直接将它传递给另一个函数,或者用它做任何其他需要做的事情。

image-20201025143636541

Go要求声明了返回类型的任何函数都必须以return语句结束,从而帮助你检测这种情况。以任何其他语句结束将导致编译错误。

如果返回值的类型与声明的返回类型不匹配,你也会收到一个编译错误。


错误值

在可以从paintNeeded函数返回错误值之前,我们需要返回一个错误值。一个错误值是一个可以返回字符串的名为Error的方法返回的任何值。创建错误值的最简单方法是将字符串传递给errors包的New函数,该函数将返回一个新的错误值。如果对该错误值调用Error方法,将会得到传递给errors.New的字符串。


声明多个返回值

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

以后,当调用该函数时,你将需要考虑额外的返回值,通常通过将它们分配给额外的变量来实现。

image-20201026094530057

如果要使返回值的目的更清楚,你可以为每个返回值提供名称,类似于参数名称。命名返回值的主要用途是作为程序员阅读代码的文档。

image-20201026094633457


函数形参接收实参的副本

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

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

指针

你可以使用一个&符号获取变量的地址,它是Go的“地址”运算符。例如,这段代码初始化一个变量,打印它的值,然后打印变量的地址……

>package main
>import "fmt"
>func main() {
var ina int=1
fmt.Println(ina)
fmt.Print(&ina)
>}

image-20201026095222113


指针类型

指针的类型可以写为一个符号,后面跟着指针指向的变量的类型。例如,指向一个int变量的指针的类型将被写为int(你可以将其大声读作“指向int的指针”)。

package main
import (
	"fmt"
	"reflect"
)
func main() {
	var ina int=1
	fmt.Print(reflect.TypeOf(&ina))
}

image-20201026095422209


获取或更改指针的值

可以通过在代码中的指针之前输入运算符来获得指针引用的变量的值。例如,要获得myIntPointer处的值,可以输入myIntPointer。(对于如何读出没有官方的一致意见,但是我们喜欢把它读成“处的值”,所以myIntPointer就是“myIntPointer处的值”。)

image-20201026095534510

  • *运算符还可用于更新指针处的值:

    image-20201026095617517


函数指针

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

image-20201026095706804

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

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



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

数组 上一篇
语法基础 下一篇