Go语言函数基本使用笔记

266 阅读2分钟

Go函数特点

  • 支持多返回值
  • 支持命名返回参数
  • 支持匿名函数和闭包
  • 函数也是一种类型,一个函数可以赋值给变量
  • 不支持 嵌套 (nested) 一个包不能有两个名字一样的函数
  • 不支持 重载 (overload)
  • 不支持 默认参数 (default parameter)

基本使用

普通函数声明

func 函数名(形式参数列表)(返回值列表){
    函数体
}

使用关键字func定义函数,左大括号依旧不能另起一行 相邻参数类型一致的,则可以用一个来表示 返回值有多个类型的必须放在括号里面

// 普通方式
func test(x int, y int, s string) (int, string) {
    return x ,s
}

// x,y 属于同一个类型 可以实现参数合并
func test(x, y int, s string) (int, string) {
    z := x + y          
    return z, s
}

有参数无返回值

func login(x int, y int) {
  println(x, y)
}

无参数有返回值

func login() bool{
  return true
}

如果有不定参数,必须作为函数的最后一个参数

func forgot(x, y int, arr ...int) {
  println(x, y)
  fmt.Println(arr)
}

// 调用
forgot(x, y, 1, 2, 3)

函数参数传递

值传递:在调用函数的时候将实际参数赋值一份传递的函数中,在函数中对参数修改,不会影响到全局

func swap(x, y int) int {
   ... 
   ...
}

引用传递:调用函数时将实际参数的地址传递到函数中(指针传递),那么在函数中对参数所进行的修改,将影响到全局

// 传递地址(指针、门牌号,指向同一块内存)
func swap(x, y *int) {
    var temp int

    temp = *x /* 保存 x 的值 */
    *x = *y   /* 将 y 值赋给 x */
    *y = temp /* 将 temp 值赋给 y*/
}

func main() {
 var a, b int = 1, 2
 // 传递指针
 swap(&a, &b)
 // a,b的值进行交换
  fmt.Println(a, b)
}

函数返回值

_标识符,用来忽略函数的某个返回值

Golang返回值不能用容器对象接收多返回值。只能用多个变量,或 "_" 忽略。

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

func main() {
    // x = test()   // Error: multiple-value test() in single-value context
    // _忽略
    x, _ := test()
    println(x)
}

命名返回参数可看做与形参类似的局部变量,最后由 return 隐式返回。

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

命名返回参数可被同名局部变量遮蔽,此时需要显式返回。

func add(x, y int) (z int) {
  { // 不能在一个级别,引发 "z redeclared in this block" 错误。
    var z = x + y
    // return   // Error: z is shadowed during return
    return z // 必须显式返回。
  }
}