【Go】六、函数

文章目录

1、函数的定义

语法:

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

注意点:

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

示例:

go 复制代码
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)
}

无返回值:

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

多个返回值:

多个返回值,但只接收一个返回值,用_忽略:

2、内存分析

go 复制代码
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不支持方法的重载
  • 支持可变长参数,函数内部将可变参数当做切片来处理
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中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。

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)
}

运行结果:

go 复制代码
a的类型是:func(int),test函数的类型是:func(int)
10

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

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

语法:

go 复制代码
 type 自定义数据类型名  数据类型       

type mylnt int ,即myInt等价于int

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

go 复制代码
//定义一个函数,把另一个函数作为形参:
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里做对应了。

相关推荐
啦啦右一23 分钟前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien25 分钟前
Spring Boot常用注解
java·spring boot·后端
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans2 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#