【Go】六、函数

1、函数的定义

语法:

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

注意点:

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

示例:

func cal (num1 int,num2 int) (int) { //如果返回值类型就一个的话,那么()是可以省略不写的
        var sum int = 0
        sum += num1
        sum += num2
        return sum
}


func main(){
        //功能:10 + 20
        //调用函数:
        sum := cal(10,20)
        fmt.Println(sum)
}

无返回值:

func cal (num1 int,num2 int) { //无返回值
        var sum int = 0
        sum += num1
        sum += num2
        fmt.Println(sum)
}

多个返回值:

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

在这里插入图片描述

2、内存分析

package main
import "fmt"
//自定义函数:功能:交换两个数
func exchangeNum (num1 int,num2 int){ 
        var t int
        t = num1
        num1 = num2
        num2 = t
}
func main(){	
        //调用函数:交换10和20
        var num1 int = 10
        var num2 int = 20
        fmt.Printf("交换前的两个数: num1 = %v,num2 = %v \n",num1,num2)   //10、20
        exchangeNum(num1,num2)
        fmt.Printf("交换后的两个数: num1 = %v,num2 = %v \n",num1,num2)	//也是10、20
}

在这里插入图片描述

3、注意点

  • 和Java不一样,go不支持方法的重载
  • 支持可变长参数,函数内部将可变参数当做切片来处理
package main
import "fmt"
//可变参数 ...  参数的数量可变,Java中是【类型... 可变长参数名】
//args...int 可以传入任意多个数量的int类型的数据  传入0个,1个,,,,n个
func test (args...int){
        //函数内部处理可变参数的时候,将可变参数当做切片来处理
        //遍历可变参数:len函数求长度
        for i := 0; i < len(args); i++ {
                fmt.Println(args[i])
        }
}
func main(){	
        test()
        fmt.Println("--------------------")
        test(3)
        fmt.Println("--------------------")
        test(37,58,39,59,47)
}
  • 基本数据类型和数组默认都是值传递的,即进行值拷贝,调函数修改,不会影响原来的值

在这里插入图片描述

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

在这里插入图片描述

4、函数数据类型

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

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

运行结果:

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

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

在这里插入图片描述

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

语法:

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

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

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

//定义一个函数,把另一个函数作为形参:
func test02 (num1 int ,num2 float32, testFunc func(int)){
        fmt.Println("-----test02")
}

//type
type myFunc func(int)
func test02 (num1 int ,num2 float32, testFunc myFunc){
        fmt.Println("-----test02")
}

6、支持对返回值命名

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

在这里插入图片描述

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

在这里插入图片描述

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

相关推荐

  1. go 函数

    2024-03-30 06:24:02       27 阅读
  2. Go函数

    2024-03-30 06:24:02       25 阅读
  3. Go 语言函数

    2024-03-30 06:24:02       76 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 06:24:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 06:24:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 06:24:02       87 阅读
  4. Python语言-面向对象

    2024-03-30 06:24:02       96 阅读

热门阅读

  1. Spring和Spring Boot的区别

    2024-03-30 06:24:02       38 阅读
  2. RuoYi-Vue-Plus (LoginHelper)

    2024-03-30 06:24:02       49 阅读
  3. vant Circle 环形进度条写一个倒计时组件

    2024-03-30 06:24:02       39 阅读
  4. 聊聊websocket opcode中的text / binary模式

    2024-03-30 06:24:02       51 阅读
  5. SpringMVC源码分析(八)--参数解析器

    2024-03-30 06:24:02       44 阅读
  6. JVM调优

    JVM调优

    2024-03-30 06:24:02      32 阅读
  7. 如何创建azure pipeline

    2024-03-30 06:24:02       43 阅读