浅谈go的函数

102 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

函数声明

函数声明:一个函数名,参数列表,返回值列表和函数体。

如果函数没有返回值,则返回列表可以不写,函数可以没有参数或接受多个参数。

函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语句。

注意类型在变量名之后 eg: func test(x int)

当两个以上的函数命名参数是同一类型,只要在最后一个上写类型即可 eg: func test(x , y int)

函数可以返回任意数量的返回值。

使用关键字 func 定义函数,左大括号不能另起一行

func test(x, y int, s string) (int, string) {
    // 类型相同的相邻参数,参数类型可合并。 多返回值必须用括号。
    n := x + y          
    return n, s
}

注意:函数定义有返回值,就必须要有return,否则会出现编译错误。

当遇到没有函数体的函数声明,这表示该函数不是以Go实现的,是为了定义函数标识符。

 func Sin(x float64) float

函数参数

  1. 函数定义的变量可称为该函数的形参,形参就像定义在函数体内的局部变量
  2. 调用函数传递过来的变量为实参,函数可以通过两种方式来传递参数:
  3. 值传递:调用函数时将实际参数拷贝一份传递到函数中,对参数修改不会影响实际参数的值
  4. 引用传递:调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
package main

import (
    "fmt"
)

//值传递
func swap(x, y int) int {
       ... ...
  }

//引用传递
func swap(x, y *int) {
    var temp int
    temp = *x 
    *x = *y  
    *y = temp 
}

func main() {
    var a, b int = 1, 2
    swap(&a, &b)
    fmt.Println(a, b)
}

一般情况下,函数都是使用值传递

  1. 无论是值传递,还是引用传递,传递给函数的都是变量的副本
  2. 值传递是值的拷贝,引用传递是地址的拷贝
  3. 地址拷贝更为高效,值拷贝取决于拷贝的对象大小,对象越大,则性能越低
  4. map、slice、chan、指针、interface默认以引用的方式传递。

在参数赋值时可以不用用一个一个的赋值,可以直接传递一个数组或者切片,特别注意的是在参数后加上即可。

可变参数本质上就是 slice

  func myfunc(args ...int) {    //0个或多个参数
  }

  func add(a int, args…int) int {    //1个或多个参数
  }

返回值

可以使用"_"标识符,用来忽略函数的某个返回值 没有定义变量的 return 语句,可以使用函数返回定义中的参数,这种用法被称作返回。

package main

func test() (int, int) {
    return 1, 2
}

func main() {   
    x, _ := test()
    println(x)
}

总结

今天主要学习了Go函数基础知识,函数的声明,参数的使用,返回值,,这都是后面需要反复复习的,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!