函数
本文最后更新于203 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

函数

为什么要使用函数!

提高代码的复用型,减少代码的冗余,代码的维护性也提高了

函数的定义:

为完成某一功能的程序指令(语句)的集合,称为函数。

基本语法

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

示例

package main

import (
    "fmt"
)
//定义一个2个数求和的函数mang
func mang (sum1 int,sum2 int) int {//返回值一个时可以把()省掉
    sum := sum1 + sum2
    return sum
}

func mang1 (sum1 int,sum2 int)(int,int){//返回值有两个或多个时,需要使用()
    sumjia := sum1 + sum2
    sumjian := sum1 - sum2
    return sumjia,sumjian
}

func main()  {
    sum := mang(10,20)//调用mang函数求和
    fmt.Println(sum)
    fmt.Println("---------") //隔断
    sum2,sum3 := mang1(10,20)//调用mang1函数求和与差
    fmt.Println(sum2,sum3)
}

结果:

image-20240702173436819

案例

package main

import (
    "fmt"
)
//定义一个交换函数
func exchangeNum(num1 int,num2 int) {   
    i := num1
    num1 = num2
    num2 = i
}
func main()  {
    var a int = 66
    var b int = 99
    fmt.Printf("a=%v , b=%v\n",a,b)//未交换前输出a与b的值
    fmt.Println("---------")
    exchangeNum(a,b)//调佣exchangeNum交换a,b
    fmt.Printf("a=%v , b=%v",a,b)//交换后输出a与b的值
}

结果:交换失败

image-20240702175550348

内存分析:

image-20240702175434108

Golang中函数不支持重载

同一个包内不能有两个同名的函数

Golang中支持可变参数(如果你希望函数带有可变数量的参数)

基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。

package main

import(
    "fmt"
)
//定义一个函数,函数的参数为:可变参数...参数的数量可变
func test (num...int){//num...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
    for i := 1; i < len(num); i++ {
        fmt.Println(num[i])
    }
}
func main()  {
    test(1)
    fmt.Println("-------")
    test(1,2)
    fmt.Println("-------")
    test(1,2,3)
    fmt.Println("-------")
    test(1,2,3,4)
    fmt.Println("-------")
    test(1,2,3,4,5)
}

image-20240702182258767

以值传递方式的数据类型

如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。

package main

import (
    "fmt"
)
//定义一个改变输入指向地址储存的值的函数
func today(num *int)  {
    *num = 30
}

func main(){
    var num int = 10
    today(&num)//调用函数改变num指向内存地址储存的值
    fmt.Println(num)
}

image-20240702204852629

在Go中,函数也是一种数据类型

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

函数可以作为形参,并且调用(把函数本身当做一种数据类型)

package main

import (
    "fmt"
)
//定义一个函数
func test (sum int){
    fmt.Println(sum)
}
func main()  {
    a := test  //将a定义为test数据类型
    fmt.Printf("a的数据类型是%T,test的数据类型是%T\n",a,test)
    //a的数据类型是func(int),test的数据类型是func(int)
    test1(5,test)
    test1(6,a)
}
//func(int)函数作为一种数据类型可以作为形参用于函数的定义
func test1(sum int,sum1 func(int))  {
    fmt.Println("---666---")
}

image-20240702212103499

Go支持自定义数据类型

基本语法: type 自定义数据类型名 数据类型

package main

import (
    "fmt"
)

func main()  {
    type kkk int
    var a kkk = 5
    fmt.Printf("a的数据类型是%T,a的值为%v\n",a,a)
    c := test//将b定义为func(int)数据类型
    test01(6,test) 
    test01(8,c)
}
//定义一个函数,可以作为数据类型使用
func test(sum int)  {
    fmt.Println("----9999----")
}
type myFunc func(int)//给func(int)定义名字为jjj,并用做test01函数作为形参
func test01(a int,b myFunc)  {
    fmt.Println("----6666----")
}

image-20240702215247903

支持对函数返回值命名

package main

import (
    "fmt"
)
//定义一个求和与求差的函数
//对函数返回值进行命名,函数体顺序不用对应
func test(a int,b int)(sum int,sum1 int)  {
    sum1 = a-b
    sum = a+b
    return
}

func main()  {
    a,b:=test(10,20)
    fmt.Println(a,"\n",b)
}

屏幕截图 2024-07-02 220300

文末附加内容
上一篇
下一篇