Go 语言学习手札 ━━ 函数

函数是基本的代码块,用于执行一个任务。在一个可执行的 Go 程序中,至少包含一个 main() 函数

函数的定义

在 Go 语言中,使用 func 声明一个函数,函数的定义格式如下:

func 函数名([参数1,参数2,…]) [返回类型] {
函数体
}

  • func:声明函数的关键字
  • 函数名:函数名称,一般使用驼峰命名法,以大写开头的函数表示可以被其他包调用,小写开头的函数只能在当前文件中被访问。
  • 参数列表:一个函数可以有多个参数,当函数被调用时,需要传入与参数列表对应的值。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • 返回类型:返回类型,函数返回一列值。返回类型是该列值的数据类型。有些功能不需要返回值,这种情况下返回类型不是必须的。
  • 函数体:函数定义的代码集合。
package main

import "fmt"

func getA() string {
    return "A"
}

/**
 * 数组求和
 * @param   array arr     需要求和的数组
 * @return  int
 */
func arrSum(arr []int) int {
    sum := 0
    for _, value := range arr {
        sum += value
    }

    return sum
}

func main() {
    a := getA()
    fmt.Print(a, "\n") // 输出 A

    b := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    fmt.Print(arrSum(b), "\n") // 输出 55
}

在 Go 语言中,一个函数可以返回多个值,例:

package main

import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}

func main() {
   a, b := swap("Google", "Runoob")
   fmt.Println(a, b)
}

函数的用法

将函数作为另外一个函数的实参,例:

package main

import (
   "fmt"
   "math"
)

func main(){
   /* 声明函数变量 */
   getSquareRoot := func(x float64) float64 {
      return math.Sqrt(x)
   }

   /* 使用函数 */
   fmt.Println(getSquareRoot(9))

}

也可以被用作与回调,例:

package main
import "fmt"

// 声明一个函数类型
type cb func(int) int

func main() {
    testCallBack(1, callBack)
    testCallBack(2, func(x int) int {
        fmt.Printf("我是回调,x:%d\n", x)
        return x
    })
}

func testCallBack(x int, f cb) {
    f(x)
}

func callBack(x int) int {
    fmt.Printf("我是回调,x:%d\n", x)
    return x
}

闭包

Go 语言支持匿名函数,可作为闭包。匿名函数是一个”内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。例:

package main

import "fmt"

func getSequence() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main(){
    // nextNumber 为一个函数,函数 i 为 0
    nextNumber := getSequence()

    // 调用 nextNumber 函数,i 变量自增 1 并返回
    fmt.Println(nextNumber())
    fmt.Println(nextNumber())
    fmt.Println(nextNumber())

    // 创建新的函数 nextNumber1,并查看结果
    nextNumber1 := getSequence()
    fmt.Println(nextNumber1())
    fmt.Println(nextNumber1())
}

以及带参数的闭包函数,例如:

package main
import "fmt"
func main() {
    add_func := add(1,2)
    fmt.Println(add_func(1,1))
    fmt.Println(add_func(0,0))
    fmt.Println(add_func(2,2))
} 
// 闭包使用方法
func add(x1, x2 int) func(x3 int,x4 int)(int,int,int)  {
    i := 0
    return func(x3 int,x4 int) (int,int,int){ 
       i++
       return i,x1+x2,x3+x4
    }
}

方法

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

func (variable_name variable_data_type) function_name() [return_type] {
/* 函数体*/
}

例:

package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

Go 没有面向对象,而我们知道常见的 Java、C++ 等语言中,实现类的方法做法都是编译器隐式的给函数加一个 this 指针,而在 Go 里,这个 this 指针需要明确的申明出来,其实和其它 OO 语言并没有很大的区别。

标签:

About: Mr.zhang

成谜于写 bug 无法自拔~


发表评论

邮箱地址不会被公开。 必填项已用*标注