【Go】六、函数

阳光穿透心脏的1/2处 2024-04-23 15:42 119阅读 0赞

文章目录

  • 1、函数的定义
  • 2、内存分析
  • 3、注意点
  • 4、函数数据类型
  • 5、自定义数据类型(起别名)
  • 6、支持对返回值命名

1、函数的定义

语法:

  1. func 函数名(形参列表)(返回值类型列表){
  2.       执行语句..
  3.       return + 返回值列表
  4. }

注意点:

  • 函数名首字母大写,可以被本包和其他包文件调用(public)
  • 函数名首字母小写,只能在本包文件中使用(private)

示例:

  1. func cal (num1 int,num2 int) (int) {
  2. //如果返回值类型就一个的话,那么()是可以省略不写的
  3. var sum int = 0
  4. sum += num1
  5. sum += num2
  6. return sum
  7. }
  8. func main(){
  9. //功能:10 + 20
  10. //调用函数:
  11. sum := cal(10,20)
  12. fmt.Println(sum)
  13. }

无返回值:

  1. func cal (num1 int,num2 int) {
  2. //无返回值
  3. var sum int = 0
  4. sum += num1
  5. sum += num2
  6. fmt.Println(sum)
  7. }

多个返回值:

在这里插入图片描述
多个返回值,但只接收一个返回值,用_忽略:

在这里插入图片描述

2、内存分析

  1. package main
  2. import "fmt"
  3. //自定义函数:功能:交换两个数
  4. func exchangeNum (num1 int,num2 int){
  5. var t int
  6. t = num1
  7. num1 = num2
  8. num2 = t
  9. }
  10. func main(){
  11. //调用函数:交换10和20
  12. var num1 int = 10
  13. var num2 int = 20
  14. fmt.Printf("交换前的两个数: num1 = %v,num2 = %v \n",num1,num2) //10、20
  15. exchangeNum(num1,num2)
  16. fmt.Printf("交换后的两个数: num1 = %v,num2 = %v \n",num1,num2) //也是10、20
  17. }

在这里插入图片描述

3、注意点

  • 和Java不一样,go不支持方法的重载
  • 支持可变长参数,函数内部将可变参数当做切片来处理

    package main
    import “fmt”
    //可变参数 … 参数的数量可变,Java中是【类型… 可变长参数名】
    //args…int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
    func test (args…int){

    1. //函数内部处理可变参数的时候,将可变参数当做切片来处理
    2. //遍历可变参数:len函数求长度
    3. for i := 0; i < len(args); i++ {
    4. fmt.Println(args[i])
    5. }

    }
    func main(){

    1. test()
    2. fmt.Println("--------------------")
    3. test(3)
    4. fmt.Println("--------------------")
    5. test(37,58,39,59,47)

    }

  • 基本数据类型和数组默认都是值传递的,即进行值拷贝,调函数修改,不会影响原来的值

在这里插入图片描述

  • 以值传递方式的数据类型,如基本数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量

在这里插入图片描述

4、函数数据类型

在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。

  1. package main
  2. import "fmt"
  3. //定义一个函数:
  4. func test(num int){
  5. fmt.Println(num)
  6. }
  7. func main(){
  8. //函数也是一种数据类型,可以赋值给一个变量
  9. a := test//变量就是一个函数类型的变量
  10. fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)
  11. //通过该变量可以对函数调用
  12. a(10) //等价于 test(10)
  13. }

运行结果:

  1. a的类型是:func(int),test函数的类型是:func(int)
  2. 10

既然可以有函数类型的变量,那函数类型的形参也可以:

在这里插入图片描述

5、自定义数据类型(起别名)

语法:

  1. type 自定义数据类型名 数据类型

type mylnt int ,即myInt等价于int
在这里插入图片描述

注意,虽然是别名,但仍然不能直接互相赋值。

  1. //定义一个函数,把另一个函数作为形参:
  2. func test02 (num1 int ,num2 float32, testFunc func(int)){
  3. fmt.Println("-----test02")
  4. }
  5. //type
  6. type myFunc func(int)
  7. func test02 (num1 int ,num2 float32, testFunc myFunc){
  8. fmt.Println("-----test02")
  9. }

6、支持对返回值命名

对函数返回值命名,里面顺序就无所谓了,顺序不用对应,也不用return后面跟了。旧的写法:

在这里插入图片描述

此时,result01就对应第一个返回值,int类型,result02就对应第二个返回值,int类型。改用升级写法:

在这里插入图片描述

有了命名,就不用再return里做对应了。

发表评论

表情:
评论列表 (有 0 条评论,119人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Go函数

    语法:注意点:示例:无返回值:多个返回值:多个返回值,但只接收一个返回值,用_忽略:,调函数修改,不会影响原来的值在Go中,函数也是一种数据类型,可以赋值给一个变量,则该...