zhcn 编程语言 Golang Golang 容器 非公開: Go语言函数声明(函数定义)

Go语言函数声明(函数定义)

函数构成了代码执行的逻辑结构。在Go语言中,函数的基本组成部分是:关键字func、函数名、参数列表、返回值、函数体和return语句。每个程序都包含许多功能。函数是基本的代码块。

Go语言是编译型语言,所以你编写函数的顺序并不重要,但是为了可读性,最好将main()函数写在文件之前,而将其他函数写在文件内部是最好的。特定的逻辑顺序(例如,函数由调用序列描述)。

编写多个函数的主要目的是将需要多行代码的复杂问题分解为一组更简单的任务来解决。此外,同一个任务(函数)可以被多次调用,从而更容易重用代码(事实上,好的程序会密切关注 DRY 原则,即避免重复自己,这意味着执行特定任务的代码在程序中只能出现一次。

当函数执行到代码块的最后}或 return 语句之前时,函数退出。 return 语句可以包含零个或多个参数,这些参数用作调用者的返回值。您还可以使用简单的 return 语句来结束无限 for 循环或终止 goroutine。

Go 语言中的函数分为三种类型。

  • 常规命名函数
  • 匿名函数或 lambda 函数
  • 方法

普通函数声明(定义)

函数声明包括函数名称、形式参数列表、可选返回值列表和函数体。

func 関数名(パラメータリスト)(返回值列表){
    コード
}

形参列表描述了函数的参数名称和参数类型。这些参数是局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名称和类型。对于函数,如果返回未命名变量或不返回值,则可以省略返回值列表中的括号。

如果函数声明中不包含返回值列表,则下面的 Hypot 函数在函数体执行后不会返回任何值。

 func hypot(x, y float64) float64 {
    return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3,4)) // "5" 

x 和 y 是形式参数名称,3 和 4 是调用时传递的实数。该函数返回一个 float64 类型的值。返回值也可以与形参同名。在这种情况下,每个返回值都被声明为局部变量,并根据返回类型初始化为 0。

如果使用返回值列表声明函数,则必须以 return 语句终止,除非该函数明显无法运行完成。例如,在函数末尾引发紧急异常,或者函数内存在无限循环。

与 Hypot 函数一样,如果一组形参或返回值具有相同的类型,则无需为每个形参编写参数类型。以下两个声明是等效的:

 func f(i, j, k int, s, t string) { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... */ } 

下面是声明具有两个 int 参数和一个 int 返回值的函数的四种方法。空白_可以强调未使用特定参数。

 func add(x int, y int) int {return x + y}
func sub(x, y int) (z int) { z = x - y; return}
func first(x int, _ int) int { return x }
func zero(int, int) int { return 0 }
fmt.Printf("%T\n", add) // "func(int, int) int"
fmt.Printf("%T\n", sub) // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero) // "func(int, int) int" 

函数的类型称为其标识符,如果两个函数的参数列表和返回列表中的变量类型之间存在一一对应的关系,则认为两个函数具有相同的类型和标识符。 、形式参数和返回变量名称不影响它们是否可以用函数标识符或省略参数类型的形式表示。

每次调用函数时,必须按照声明的顺序为所有参数提供实际参数(参数值)。当调用函数时,Go语言没有默认参数值,也没有办法通过参数指定形式参数。这些名称,即形式参数和返回值的变量名称,对于函数的调用者来说没有任何意义。

在函数中,实参是按值传递的,因此函数的形参是实参的副本,形参的改变不会影响实参。但是,如果实参包含引用,则对于指针、切片、映射、函数和通道等类型,可以通过函数的间接修改来修改实参。

函数返回值

Go语言支持多个返回值,可以方便地在函数执行后检索多个返回参数。 Go语言经常使用多个返回值的最后一个返回参数来返回函数执行过程中可能出现的任何错误。示例代码如下。

 conn、err:= connectToNetwork() 

在此代码中,connectToNetwork 返回两个参数。 conn 代表连接对象,err 返回错误消息。

其他编程语言中函数的返回值

  • C/C++语言仅支持一种返回值。如果需要返回多个值,则应该使用结构体来返回结果,或者在参数中使用指针变量来修改传递给它的变量值。因此,出于安全考虑,C++语言建议在参数返回数据时使用引用而不是指针。
  • 虽然C#语言不具备多返回值的能力,但是C#语言后面添加的ref和out关键字可以通过函数的调用参数来检索函数体内修改的数据。
  • 虽然lua语言没有指针,但它确实支持多个返回值,这在处理大数据块时非常有用。

由于Go语言同时支持安全指针和多个返回值,因此使用函数来编写逻辑更加方便。

1)相同类型的返回值

如果返回类型相同,请将多个返回类型括在括号中,并用逗号分隔每个返回类型。

使用 return 语句返回时,值列表的顺序必须与函数声明的返回类型匹配。示例代码如下。

 func typedTwoValues() (int, int) {
    return 1, 2
}
func main() {
    a, b := typedTwoValues()
    fmt.Println(a, b)
} 

代码输出结果:

1 2

纯类型返回值对于代码可读性不太友好。无法区分每个返回参数的含义,特别是当出现相同类型的返回值时。

2) 返回值包括变量名

Go语言支持返回值命名,因此返回值与参数具有相同的参数变量名称和类型。

命名返回变量默认为类型的默认值。即,数字为 0,字符串为空字符串,布尔值为 false,指针为 nil,等等。

以下代码中的函数有两个整数返回值。声明函数时,返回值被命名为a和b,因此函数的返回值可以直接在函数体中赋值。在具有命名返回值的函数体中,为了使用该方法,必须在函数退出之前显式使用 return 语句将其返回。这是代码:

 func namedRetValues() (a, b int) {

    a = 1
    b = 2

    return
} 

代码说明如下:

  • 第一行命名了两个整数返回值a和b。
  • 第3行和第4行名为return value的变量与该函数的布局变量作用相同,可以赋值和获取返回值。
  • 第6行,如果函数使用命名返回值,则不能填写返回值列表,但可以填写值。运行以下代码的效果与运行上面代码的效果相同。上面的代码。
     func namedRetValues() (a, b int) {
        a = 1
    
        return a, 2
    }
    ※関数 namedRetValues() は、aとb という2つの整数型の戻り値を持ちます。
    ※ a には1を代入します。
    ※ aと2を返します。 

尖端

只能选择一个相同类型的返回值和一个命名返回值。将它们混合在一起(如下面的代码所示)将导致编译错误。

 func namedRetValues() (a, b int, int) 

编译错误信息:

mixed named and unnamed function parameters

含义:函数参数包括命名参数和未命名参数的混合。

函数调用

定义函数后,当前代码可以通过调用它来跳转到被调用函数并执行。函数调用前的局部变量会被保留,不会丢失。当被调用函数执行完毕后,将恢复到下一个值。调用函数。代码在函数的下一行继续执行,并且之前的局部变量仍然可以访问。

函数内的局部变量只能在函数体内使用,在函数调用结束后被释放并失效。

Go语言函数调用格式如下。

返回值变量列表 = 函数名(参数列表)

下面是每个部分的描述。

  • 函数名称:被调用的函数的名称。
  • 参数列表:参数变量之间用逗号分隔,不需要以分号结尾。
  • 返回值变量列表:多个返回值之间用逗号分隔。

例如,加法函数的调用方式为:

result := add(1,1)

通俗易懂的《Go语言函数声明(函数定义)》讲解!您必须观看的 2 个最佳视频

関数型言語とは何か?(Haskellで学ぼう)【歴史~オブジェクト指向との比較】
https://www.youtube.com/watch?v=4zSEJ7T2Qnc&pp=ygUwIEdv6KiA6Kqe44Gu6Zai5pWw5a6j6KiA77yI6Zai5pWw5a6a576p77yJJmhsPUpB
【初心者必見!】Go言語とは?できることや学ぶメリット・将来性について解説
https://www.youtube.com/watch?v=wY_wxYwPiDU&pp=ygUwIEdv6KiA6Kqe44Gu6Zai5pWw5a6j6KiA77yI6Zai5pWw5a6a576p77yJJmhsPUpB
函数构成了代码执行的逻辑结构。在Go语言中,函数的基本组成部分是:关键字func、函数名、参数列表、返回值、函数体和return语句。每个程序都包含许多功能。函数是基本的代码块。

Go语言是编译型语言,所以你编写函数的顺序并不重要,但是为了可读性,最好将main()函数写在文件之前,而将其他函数写在文件内部是最好的。特定的逻辑顺序(例如,函数由调用序列描述)。

编写多个函数的主要目的是将需要多行代码的复杂问题分解为一组更简单的任务来解决。此外,同一个任务(函数)可以被多次调用,从而更容易重用代码(事实上,好的程序会密切关注 DRY 原则,即避免重复自己,这意味着执行特定任务的代码在程序中只能出现一次。

当函数执行到代码块的最后}或 return 语句之前时,函数退出。 return 语句可以包含零个或多个参数,这些参数用作调用者的返回值。您还可以使用简单的 return 语句来结束无限 for 循环或终止 goroutine。

Go 语言中的函数分为三种类型。

  • 常规命名函数
  • 匿名函数或 lambda 函数
  • 方法

普通函数声明(定义)

函数声明包括函数名称、形式参数列表、可选返回值列表和函数体。

func 関数名(パラメータリスト)(返回值列表){
    コード
}

形参列表描述了函数的参数名称和参数类型。这些参数是局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名称和类型。对于函数,如果返回未命名变量或不返回值,则可以省略返回值列表中的括号。

如果函数声明中不包含返回值列表,则下面的 Hypot 函数在函数体执行后不会返回任何值。

 func hypot(x, y float64) float64 {
    return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3,4)) // "5" 

x 和 y 是形式参数名称,3 和 4 是调用时传递的实数。该函数返回一个 float64 类型的值。返回值也可以与形参同名。在这种情况下,每个返回值都被声明为局部变量,并根据返回类型初始化为 0。

如果使用返回值列表声明函数,则必须以 return 语句终止,除非该函数明显无法运行完成。例如,在函数末尾引发紧急异常,或者函数内存在无限循环。

与 Hypot 函数一样,如果一组形参或返回值具有相同的类型,则无需为每个形参编写参数类型。以下两个声明是等效的:

 func f(i, j, k int, s, t string) { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... */ } 

下面是声明具有两个 int 参数和一个 int 返回值的函数的四种方法。空白_可以强调未使用特定参数。

 func add(x int, y int) int {return x + y}
func sub(x, y int) (z int) { z = x - y; return}
func first(x int, _ int) int { return x }
func zero(int, int) int { return 0 }
fmt.Printf("%T\n", add) // "func(int, int) int"
fmt.Printf("%T\n", sub) // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero) // "func(int, int) int" 

函数的类型称为其标识符,如果两个函数的参数列表和返回列表中的变量类型之间存在一一对应的关系,则认为两个函数具有相同的类型和标识符。 、形式参数和返回变量名称不影响它们是否可以用函数标识符或省略参数类型的形式表示。

每次调用函数时,必须按照声明的顺序为所有参数提供实际参数(参数值)。当调用函数时,Go语言没有默认参数值,也没有办法通过参数指定形式参数。这些名称,即形式参数和返回值的变量名称,对于函数的调用者来说没有任何意义。

在函数中,实参是按值传递的,因此函数的形参是实参的副本,形参的改变不会影响实参。但是,如果实参包含引用,则对于指针、切片、映射、函数和通道等类型,可以通过函数的间接修改来修改实参。

函数返回值

Go语言支持多个返回值,可以方便地在函数执行后检索多个返回参数。 Go语言经常使用多个返回值的最后一个返回参数来返回函数执行过程中可能出现的任何错误。示例代码如下。

 conn、err:= connectToNetwork() 

在此代码中,connectToNetwork 返回两个参数。 conn 代表连接对象,err 返回错误消息。

其他编程语言中函数的返回值

  • C/C++语言仅支持一种返回值。如果需要返回多个值,则应该使用结构体来返回结果,或者在参数中使用指针变量来修改传递给它的变量值。因此,出于安全考虑,C++语言建议在参数返回数据时使用引用而不是指针。
  • 虽然C#语言不具备多返回值的能力,但是C#语言后面添加的ref和out关键字可以通过函数的调用参数来检索函数体内修改的数据。
  • 虽然lua语言没有指针,但它确实支持多个返回值,这在处理大数据块时非常有用。

由于Go语言同时支持安全指针和多个返回值,因此使用函数来编写逻辑更加方便。

1)相同类型的返回值

如果返回类型相同,请将多个返回类型括在括号中,并用逗号分隔每个返回类型。

使用 return 语句返回时,值列表的顺序必须与函数声明的返回类型匹配。示例代码如下。

 func typedTwoValues() (int, int) {
    return 1, 2
}
func main() {
    a, b := typedTwoValues()
    fmt.Println(a, b)
} 

代码输出结果:

1 2

纯类型返回值对于代码可读性不太友好。无法区分每个返回参数的含义,特别是当出现相同类型的返回值时。

2) 返回值包括变量名

Go语言支持返回值命名,因此返回值与参数具有相同的参数变量名称和类型。

命名返回变量默认为类型的默认值。即,数字为 0,字符串为空字符串,布尔值为 false,指针为 nil,等等。

以下代码中的函数有两个整数返回值。声明函数时,返回值被命名为a和b,因此函数的返回值可以直接在函数体中赋值。在具有命名返回值的函数体中,为了使用该方法,必须在函数退出之前显式使用 return 语句将其返回。这是代码:

 func namedRetValues() (a, b int) {

    a = 1
    b = 2

    return
} 

代码说明如下:

  • 第一行命名了两个整数返回值a和b。
  • 第3行和第4行名为return value的变量与该函数的布局变量作用相同,可以赋值和获取返回值。
  • 第6行,如果函数使用命名返回值,则不能填写返回值列表,但可以填写值。运行以下代码的效果与运行上面代码的效果相同。上面的代码。
     func namedRetValues() (a, b int) {
        a = 1
    
        return a, 2
    }
    ※関数 namedRetValues() は、aとb という2つの整数型の戻り値を持ちます。
    ※ a には1を代入します。
    ※ aと2を返します。 

尖端

只能选择一个相同类型的返回值和一个命名返回值。将它们混合在一起(如下面的代码所示)将导致编译错误。

 func namedRetValues() (a, b int, int) 

编译错误信息:

mixed named and unnamed function parameters

含义:函数参数包括命名参数和未命名参数的混合。

函数调用

定义函数后,当前代码可以通过调用它来跳转到被调用函数并执行。函数调用前的局部变量会被保留,不会丢失。当被调用函数执行完毕后,将恢复到下一个值。调用函数。代码在函数的下一行继续执行,并且之前的局部变量仍然可以访问。

函数内的局部变量只能在函数体内使用,在函数调用结束后被释放并失效。

Go语言函数调用格式如下。

返回值变量列表 = 函数名(参数列表)

下面是每个部分的描述。

  • 函数名称:被调用的函数的名称。
  • 参数列表:参数变量之间用逗号分隔,不需要以分号结尾。
  • 返回值变量列表:多个返回值之间用逗号分隔。

例如,加法函数的调用方式为:

result := add(1,1)

通俗易懂的《Go语言函数声明(函数定义)》讲解!您必须观看的 2 个最佳视频

関数型言語とは何か?(Haskellで学ぼう)【歴史~オブジェクト指向との比較】
https://www.youtube.com/watch?v=4zSEJ7T2Qnc&pp=ygUwIEdv6KiA6Kqe44Gu6Zai5pWw5a6j6KiA77yI6Zai5pWw5a6a576p77yJJmhsPUpB
【初心者必見!】Go言語とは?できることや学ぶメリット・将来性について解説
https://www.youtube.com/watch?v=wY_wxYwPiDU&pp=ygUwIEdv6KiA6Kqe44Gu6Zai5pWw5a6j6KiA77yI6Zai5pWw5a6a576p77yJJmhsPUpB