Go函数的定义和细节梳理
func 函数名(参数列表{参数名1 类型,参数名2,类型})(返回值列表{返回值名1 类型,返回值名2 类型}){
方法体
}
细节梳理:
-
函数的形参列表可以是多个,返回值列表也可以是多个。
-
形参列表和返回值列表的数据类型可以是值类型和引用类型。
-
函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写改函数可以被本包文件和其他包文件使用,类似public。首字母小写,只能被本包文件使用,类似private。
-
函数中的变量是局部的,函数外不生效。
-
基本数据类型和数组默认都是值传递,简单说就是值拷贝。在函数内修改,不会影响到原来的值。如果希望函数内的变量能修改函数外的变量(默认已值传递的数据类型),可以传入变量的地址类型&变量,函数以指针的方式操作变量。
package main import "fmt" func main() { //main方法中num var num = 1 test(num) fmt.Println("main中num = ", num) //输出1 这里是main中的num test方法已经出栈 var num2 = 1 test2(&num2) fmt.Println("main中num2=", num2) //输出2 此时main中的num2值已经被test2方法修改 } func test(num int) { //test方法中num变量 num = num + 1 fmt.Println("test中num = ", num) //输出2 当执行完此句代码 test出栈其num变量销毁 } func test2(num *int) { //传入是的num变量的地址值 *num拿到的是指针指向的变量真实的值=num指针指向地址的值+1 *num = *num + 1 fmt.Println("test2中num = ", *num) //输出2 }
-
Go函数不支持函数重载
-
在Go中,函数也是一种数据类型,可以复制给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用
package main import "fmt" func main() { //把getSum函数赋值给变量 那么myFunc变量的类型就是getSum函数类型 myFunc := getSum fmt.Printf("myFunc的类型是%T,getSum的类型是%T \n", myFunc, getSum) //myFunc的类型是func(int, int) int,getSum的类型是func(int, int) int //用变量名调用函数 result := myFunc(1, 2) fmt.Println("result=", result) //3 } func getSum(a int, b int) int { sum := a + b return sum }
- 函数既然是一种数据类型,那么在Go中,函数可以作为参数传入另外的函数中
package main import "fmt" func main() { //使用的时候传入符合改类型的函数名字即可 result := myFunc(getSum, 1, 2) fmt.Println("result=", result) //输出3 } func getSum(a int, b int) int { sum := a + b return sum } // myFunc函数的参数中有一个funVar参数名其类型是函数类型 func myFunc(funVar func(int, int) int, n1 int, n2 int) int { result := funVar(n1, n2) return result }
- 为了简化数据类型定义,GO支持自定义数据类型
package main import "fmt" func main() { //把int类型取个别名 变myInt type myInt int var num1 myInt = 10 fmt.Printf("num1的类型是%T,num1=%v \n", num1, num1) //num1的类型是main.myInt,num1=10 var num2 int = 5 //num1的类似myInt num2的类型int 此时不是相同类型所以不能直接计算 需要显示转化 num1 = num1 + myInt(num2) fmt.Println("num1=", num1) //调用函数 result := myFunc(getSum, 3, 2) fmt.Println("result=", result) //输出5 } func getSum(a int, b int) int { sum := a + b return sum } // 把func(int, int) int函数类型取个别名 把别名类型使用到myFunc函数的参数列表中 type myFuncType func(int, int) int // myFunc函数的参数中有一个funVar参数名其类型是函数类型 func myFunc(funVar myFuncType, n1 int, n2 int) int { result := funVar(n1, n2) return result }
- 支持对函数返回值命名
package main import "fmt" func main() { a, b := getSumAndSub(1, 2) fmt.Println("a=", a, " b=", b) //a= 3 b= -1 } // 给两个返回值取名为 sum 和 sub func getSumAndSub(n1 int, n2 int) (sum int, sub int) { sum = n1 + n2 sub = n1 - n2 //return sum, sub //第二种写法 return //这种写法会自动对应 }
-
使用 _ 标识符可以忽略返回值
-
Go支持可变参数
package main import "fmt" func main() { //1为test函数的第一个参数 2,3,4组成了一个数组传入test函数为第二个参数args sum := test(1, 2, 3, 4) fmt.Println("sum=", sum) //sum= 10 } func test(num int, args ...int) (sum int) { sum = num //变量数组 for _, value := range args { //value 代表args可变参数的每一个元素的值 _我们忽略了下标索引值 sum += value } return }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏