• Go 函数


    定义函数

    定义函数时需要指定:

    • 函数名
      当函数名省略时就是匿名函数
    • 型参及其类型
      当多个型参类型相同时,可以省略,只指明最后的型参类型
    • 返回值类型
      当有多个返回值时,需要使用括号
    func add(a, b int) int {
    	return a + b
    }
    

    初始化函数

    在包被导入时就会执行

    var A int
    
    func init() {
    	A = 3
    }
    

    函数类型

    函数的类型由传入参数类型和返回类型决定

    // 传入两个 int,返回值为一个 int 的函数类型
    type funcType func(int, int) int
    

    函数型参

    传递数值

    Go 默认会传入实际参数的复制,调用过程中不会影响到实际参数
    所以当传递数据特别大时,效率就会降低,这时传递引用可以提高效率

    func swap(x, y int) {
    	x, y = y, x
    }
    
    func main() {
    	x, y := 1, 2
    	swap(x, y)
    	fmt.Println(x, y)
    }
    

    输出结果:

    1 2
    

    x, y 的值并没有交换

    传递引用

    传递引用给函数就会改变实际参数值
    map、slice、chan、interface、指针默认以引用的方式传递

    func swap(x, y *int) {
    	*x, *y = *y, *x
    }
    
    func main() {
    	x, y := 1, 2
    	swap(&x, &y)
    	fmt.Println(x, y)
    }
    

    输出结果:

    2 1
    

    x, y 的值进行了交换

    匿名函数

    在声明函数时,可以通过忽略函数名的方式声明一个匿名函数

    函数变量

    可以将匿名函数赋给一个变量,之后作为值使用

    func main() {
    	var getSqrt = func (x float64) float64 {
    		return math.Sqrt(x)
    	}
    	fmt.Println(getSqrt(9))
    }
    

    返回值

    Go 中返回值也可以命名,在返回时就可以省略返回值

    func add(a, b int) (c int) {
    	c = a + b
    	// 没有写明 return c,但是依然会 return c
    	return
    }
    

    defer

    defer 指定的语句会在函数 return 时执行
    每遇到一个 defer 语句,就会将它放入栈中,在函数 return 时从栈中弹出并执行
    可用于资源释放,申请资源后直接 defer 释放资源,防止后续忘记释放
    示例:

    func main() {
    	fmt.Println(1)
    	defer fmt.Println(2)
    	defer fmt.Println(3)
    	fmt.Println(4)
    }
    

    输出结果:

    1
    4
    3
    2
    
  • 相关阅读:
    Nextcloud报 PHP zip 模块未安装
    mac修改hosts文件
    mamp
    mac自定义文件夹图标
    数据结构与算法(一)线性表顺序存储
    数据结构与算法(四)栈的链式存储
    数据结构与算法(三)栈的顺序存储
    数据结构与算法(五)循环队列实现
    力扣刷题计划
    数据结构与算法(二)线性表链式存储
  • 原文地址:https://www.cnblogs.com/dbf-/p/12059549.html
Copyright © 2020-2023  润新知