Go函数的定义个细节梳理

发布时间 2024-01-12 17:07:47作者: 程序马2023

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
}