Go 语言学习之函数

山不在高,有仙则名
水不在深,有龙则灵

函数

函数可以说是所有程序的核心,不同的语言之间,函数的定义也不尽相同,大同小异,下面就Go的函数做个简单记录

定义
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
        //这里是处理逻辑代码
        //返回多个值
        return value1, value2
    }

下面看看在c语言中和Objective-C中的定义方式

c语言定义方式
type funcName(type1 input1,type2 input2)
Objective-C定义方式
- (type)funcName:(type1 )input1 param:(type2)input2

从上面我们可以看出,其实在函数的定义上,基本上都是一样的,都由返回类型函数名入参 组成,但是在go中有个比较特殊的就是返回值,居然可以有多个返回值,是让我挺惊讶的,在Objective-C中,如果需要返回多个返回值,可以返回一个数组,用数组来装这多个返回值。

下面来看看go中函数的简单使用

一般函数

//函数测试
func moreReturnFunc(a int,b int)(c int,d int)  {
    c = a*b
    d = a/b
    return c,d;
}

//返回数组
func arrayReturnFunc(a int,b int)([]int)  {
    c := a+b;
    d := a-b;
    e := []int{c,d}
    return e;
}

//无返回值
func noReturn(width float64,height float64)  {
    area := width * height
    println(area)
}

go中,函数的定义可以有返回值也可也没有返回值,在多返回值函数中,返回的时候可以不用带上变量名,如下面这样

//不带返回值
func moreReturnFunc(a int,b int)(int,int)  {
    return a*b, a/b
}

当然在程序中,还是建议写上参数,这样方便理解和使用

可变参数

顾名思义,就是有着不定数量的参数的函数,下面我们来看看定义

func funcName(arg ...int) {}

看看使用方法

//可变参数

func sum(num ...int)  {
    fmt.Println(num)
    total := 0
    for _,value := range num{

        total += value
    }
    fmt.Println(total)
}

//主函数
func main() {

    //多返回值
    mm,bb := moreReturnFunc(20,5)

    fmt.Println(mm,bb)//输出结果 100 4

    //返回数组函数调用
    fmt.Println(arrayReturnFunc(50,5)[0],arrayReturnFunc(50,5)[1])//输出结果55 45


    //多个参数
    sum(1,2,3,4)//输出结果[1 2 3 4]    10

    //如果参数在数组里,需要加...
    sum([]int{1,2,3,4,5}...)//输出结果[1 2 3 4 5]    15
}

大概使用过程就这样

传指针

关于传指针这个问题,其实就是我们需不需要让入参的值发生变化,在c语言或者是Objective-C中如果入参为intfloat等,那么当我们在函数中对入参进行修改时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。怎么说了,大概就是这样的

//主函数
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(&plusA,&plusB),plusA)

}

func plus(a *int,b *int) int {
    *a = *a - *b
    return *a
}

//输出结果为:5   5这里由于传了指针,当*a = *a-*b的时候,改变的同一地址也就是plusA的值,所以当我们输出plusA的时候,值也就改变了

可以看看不传指针的情况

//主函数
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(plusA,plusB),plusA)

}

func plus(a int,b int) int {
    a = a - b
    return a
}

输出结果为 :5    10

注意上面传指针的时候,在调用函数的时候需要添加&符号,传指针的方法和在Objective-C中参数是对象差不多,当然前提是不是copy属性

函数作为参数类型

将函数作为参数类型之前,我们首先需要将函数定义一个类型,定义方式为

type typeName func (inputType) outType

其实就是将函数的原型定义成一个类型
可以看看具体使用,就对上面的函数进行改造添加几个函数测试

//主函数
func main() {
    plusA := 10
    plusB := 5
    fmt.Println(plus(plusA,plusB,sum,moreReturnFunc),plusA)

}

//定义类型
type moreParatest func (arg...int) int

type moreReturnParatest func (int,int) (int,int)

func plus(a int,b int,c moreParatest,d moreReturnParatest) int {
    n,m:=moreReturnFunc(4,2)
    a = a - b + c(1,2,3,4,5) + n + m
    return a
}

func sum(num ...int)  int {
    fmt.Println(num)
    total := 0
    for _,value := range num{

        total += value
    }
    fmt.Println(total)
    return total
}

func moreReturnFunc(a int,b int)(c int,d int)  {
    c = a*b
    d = a/b
    return c,d;
}

在上面的例子中,我先定义了两个类型的函数--moreParatestmoreReturnParatest,这两个函数一个是传入多个参数返回int,一个是传入两个int然后返回两个int返回值的函数,在plus函数中,将类型直接作为参数传入函数中,这样我们的参数cd就相当于两个函数,在plus函数中,我们在调用他们,具体函数实现就不去管他。
plus函数定义好之后,我们在main函数中进行调用,由于我们的sum函数和moreReturnFunc分别对应满足定义的函数类型,所以直接将该两个函数当作参数传入即可
最终结果如下

30 10

通过这样的方式,我们的程序可以变得非常灵活,特别是在封装接口的时候

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容