1.1. 一、函数的语法:

func 函数名(形参列表) (返回值类型列表){
      //函数体
      return 返回值列表
}
  • 1.1、如果只返回一个值。返回值列表的括号可以去掉。例子如下:
func add(a int,b int) int {
    return a+b
}

func main() {
    fmt.Println(add(10,90)) //输出: 100
}
  • 1.2、调用一个函数时,会在栈给这个被调用的函数分配一个新的空间;当函数执行完成后,会回收这个新的空间。
  • 1.3、如果返回多个值,可以用下划线 _ 表示忽略这个返回值
  • 1.4、基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值
  • 1.5、如果参数是指针类型,可以传入变量的地址&,函数内以指针的方式操作变量。在函数内修改,就会影响到原来的值。从效果上看类似引用 。

例子如下:func add(a *int) 函数接收指针作为参数,内部修改参数的值,会反应到外部传递的参数值。

func add(a *int) int {
    *a = *a + 3 //a的值加3
    return *a
}
func main() {
    num := 8
    add(&num) //传递num的地址
    fmt.Println("num = ",num) //num =  11
}
  • 1.6、Go 函数不支持函数重载

例子如下:add函数不支持重载

func add(a *int) int {
    *a = *a + 3 //a的值加3
    return *a
}
//编译错误,不支持函数重载
func add(a int,b int) int {
    return a
}
  • 1.7、在 Go 中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。(这个类似JavaScript的函数变量)
func add(a int,b int) int {
    return a +b
}
func main() {
    var addNum  = add //变量addNum等于函数add
    sum := addNum(3,4) //调用函数
    fmt.Println(sum) //7
}

也可以这样:变量addNum 等于一个匿名函数。

    var addNum  = func(a int,b int) int { return a +b}
    sum := addNum(3,4)
    fmt.Println(sum) // 7
  • 1.8、函数作为一种数据类型。可以像使用其他数据类型哪样使用。比如:作为另一个函数的形参。

例子如下:下面的getSum函数的形参addFunc是一个函数类型。

func add(a int,b int) int {
    return a +b
}

//第一个参数addFunc是函数类型,并且有2个形参,一个返回值。
func getSum(addFunc func(a int,b int) int,num1 int, num2 int) int {
    return addFunc(num1,num2)

}

func main() {
    //调用函数getSum,并且把add函数作为参数
    sum := getSum(add,3,4)
    fmt.Println(sum) // 7
}
  • 1.9、golang可以自定义数据类型。使用关键字type。语法如下:
type 自定义数据类型名    数据类型

例子:

type myInt int    //  这时 myInt  就等价 int 来使用了.
type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int)

完整例子如下:

func add(a int,b int) int {
    return a +b
}

type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int)

//第一个参数addFunc是函数类型,并且有2个形参,一个返回值。
func getSum(addFunc mySum,num1 int, num2 int) int {
    return addFunc(num1,num2)
}

func main() {
    //调用函数getSum,并且把add函数作为参数
    sum := getSum(add,3,4)
    fmt.Println(sum) // 7
}
  • 1.10、支持对函数返回值命名。

例子如下:就是函数声明的时候,把返回值的名字一起声明了。好处是返回值和顺序无关了,只要把对应的返回值赋值就行了。

func getSumAndSub(a int,b int) (sum int,sub int) {
    sum = a + b
    sub = a - b
    return
}
func main() {
    sum,sub := getSumAndSub(3,4)
    fmt.Println(sum,sub) // 7 -1
}
  • 1.11、go支持可变参数。如果一个函数的形参列表中有可变参数,则可变参数需要放在最后。

例子如下:其中的args是可变参数的变量名,是slice切片。可以通过args[index]取出变量的值。

// 支持0到n个参数
func sum(args... int) int {
    sum := 0
    for i:=0;i<len(args);i++ {
        sum += args[i] //args[i] 表示取出args切片的第i个元素值。
    }
    return sum
}
// 支持1到n个参数
func sum2(num1 int , num2... int) int {
    sum := num1
    for i:=0;i<len(num2);i++ {
        sum += num2[i]
    }
    return sum
}
  • 1.12、形参(或返回值)数据类型一样的时候。可以简写。这个和声明多个变量一样。

例子如下:形参都是int就简写了。返回值都是int,也简写了。

func getSumAndSub(a,b int) (sum,sub int) {
    sum = a + b
    sub = a - b
    return
}

results matching ""

    No results matching ""