zoukankan      html  css  js  c++  java
  • 5.1 Go函数定义

    1 Go函数定义

    Go函数是指:一段具有独立功能的代码,然后可以在程序中其他地方多次调用。

    Go分为自定义函数,系统函数。

    函数可以将一个大的工作拆解成小的任务。

    函数对用户隐藏了细节。

    Golang函数特点:

    支持不定长参数
    支持多返回值
    支持命名返回参数
    支持匿名函数、闭包
    函数也是类型,可以赋值给变量
    
    一个package下不得有两个同名函数,不支持函数重载
    
    函数参数可以没有,或者多个参数
    注意类型在变量名后面
    多个连续的函数命名参数是同一类型,除了最后一个类型,其余可以省略
    函数可以返回任意数量的返回值
    函数体中,形参作为局部变量
    函数返回值可以用 _标识符进行忽略
    
    main()函数由编译器调用,其他函数手动调用
    

    Go函数基本语法:

    1)形参:函数的输入参数

    2)执行代码:实现函数功能的代码块

    3)函数的返回值可有可无

    func 函数名(形参列表)(返回值列表){
        执行代码
        return 返回值列表
    }
    
    func test(x, y int, z string) (int, string) {
        //类型相同的相邻参数x,y参数类型可以合并
        //多返回值得用括号括起来
        n := x + y
        return n, z
    }
    

    1.1. 函数实战

    package main
    
    import "fmt"
    
    //最普通的函数,无参数,无返回值
    func sayHello() {
        fmt.Printf("hello world
    ")
    }
    
    //求和函数add
    func add(a, b, c int) int {
        //sum := a + b + c
        //return sum
        return a + b
    }
    
    //接收2个参数a 和b都是int类型
    //返回2个参数,sum和sub作为返回值,也叫做对返回值命名
    func calc(a, b int) (sum int, sub int) {
        sum = a + b
        sub = a - b
        return
    }
    
    //接收不定长参数个数,
    //参数名是b,类型是不固定个数的int类型
    //变量b此时是一个slice切片,数据类型:[]int,可以通过索引取值
    func calc_v1(b ...int) int {
        sum := 0
        for i := 0; i < len(b); i++ {
            sum = sum + b[i]
        }
        return sum
    }
    
    func main() {
        //调用函数
        sayHello()
        //打印返回值求和结果
        fmt.Println(add(5, 5, 5))
    
        //多个返回值
        sum1, sub1 := calc(5, 10)
        fmt.Printf("calc计算和是%d
    ", sum1)
        fmt.Printf("calc计算差是%d
    ", sub1)
    
        //传入不固定长度的参数个数
        sum := calc_v1(10, 20, 30, 40)
        fmt.Println(sum)
    
    }
    

    1.2. Go函数注意事项

    1)基本数据类型和数组默认值传递,有一个值拷贝过程,不会修改原本变量的值

    package main
    
    import "fmt"
    
    func modify(n int) {
        n = n + 100
        fmt.Println("modify函数修改后n=", n)
    }
    
    func main() {
        num := 10
        modify(num)
        fmt.Println("此时main主程中的nun值=", num)
    }
    

    2)如果希望函数可以修改函数外的变量,需要以指针传递,传入变量的地址,函数内以指针方式操作变量。

    package main
    
    import "fmt"
    
    //指针变量,接收一个地址
    func modify2(n *int) {
        *n = *n + 100
        fmt.Println("modify2修改后n的值=", *n)
    }
    
    func main() {
        num2 := 10
        modify2(&num2)
        fmt.Println("此时main主程中的num2值=", num2)
    }
    

    1.3. init函数

    每个源文件都会包含一个inti函数,该函数在main函数之前被执行。

    package main
    
    import "fmt"
    
    func init() {
        fmt.Println("init函数一般完成初始化工作,如数据库驱动连接等")
    }
    
    func main() {
        fmt.Println("我是主程序")
    }
    

    1.4. init函数细节

    go程序加载流程:

    全局变量
    ↓
    init函数
    ↓
    main函数
    
    package main
    
    import "fmt"
    
    //全局变量
    var num = test()
    
    func test() int {
        fmt.Println("执行了test()函数")
        return 999
    }
    
    func init() {
        fmt.Println("执行了init函数")
    }
    
    func main() {
        fmt.Println("我是主程序")
        fmt.Println(num)
    }
    

    面试题:

    如果再包导入中,main.go和utils.go都有变量加载,init函数,执行流程是?

    main.go是程序入口
    ↓
    自上而下,进入import导入
    ↓
    优先进入utils.go 加载全局变量  这是第一步
    ↓
    执行utils.go的init函数        第二步
    ↓
    完毕后,回到main.go的全局变量    第三步
    ↓
    执行main.go的init函数        第四步
    ↓
    执行main.go的主程main()函数    第五步
  • 相关阅读:
    排序算法之冒泡排序
    排序算法之快速排序
    排序算法之插入排序
    Java集合之LinkedList源码分析
    排序算法之选择排序
    Java集合之Vector源码分析
    Python 装饰器
    一致性哈希
    剑指Offer-数组中重复的数字
    剑指Offer-把字符串转换成整数
  • 原文地址:https://www.cnblogs.com/open-yang/p/11256832.html
Copyright © 2011-2022 走看看