Go函数的定义和细节梳理

func 函数名(参数列表{参数名1 类型,参数名2,类型})(返回值列表{返回值名1 类型,返回值名2 类型}){
方法体
}

细节梳理:

  1. 函数的形参列表可以是多个,返回值列表也可以是多个。

  2. 形参列表和返回值列表的数据类型可以是值类型和引用类型。

  3. 函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写改函数可以被本包文件和其他包文件使用,类似public。首字母小写,只能被本包文件使用,类似private。

  4. 函数中的变量是局部的,函数外不生效。

  5. 基本数据类型和数组默认都是值传递,简单说就是值拷贝。在函数内修改,不会影响到原来的值。如果希望函数内的变量能修改函数外的变量(默认已值传递的数据类型),可以传入变量的地址类型&变量,函数以指针的方式操作变量。

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
}
  1. Go函数不支持函数重载

  2. 在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
}
  1. 函数既然是一种数据类型,那么在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
}
  1. 为了简化数据类型定义,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
}
  1. 支持对函数返回值命名
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 //这种写法会自动对应
}
  1. 使用 _ 标识符可以忽略返回值

  2. 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
}
posted @   程序马2023  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示