美文网首页
Go 语言学习之函数

Go 语言学习之函数

作者: 半笑半醉間 | 来源:发表于2017-06-12 16:43 被阅读31次

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

函数

函数可以说是所有程序的核心,不同的语言之间,函数的定义也不尽相同,大同小异,下面就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

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

相关文章

  • 11.***函数***

    Go语言基础之函数 Golang 函数是组织好的、可重复使用的、用于执行指定任务的代码块。本文介绍了Go语言中函数...

  • Go语言学习之——函数

    1、基础类型 2、可以返回多个值 3、可以给返回值取名字,一般用于简单的函数 4、多个返回值时,如果只想接收一个返...

  • Go 语言学习之函数

    山不在高,有仙则名水不在深,有龙则灵 函数 函数可以说是所有程序的核心,不同的语言之间,函数的定义也不尽相同,大同...

  • (四)go语言函数&参数传递

    go语言函数 基本语法 例子 go语言参数传递

  • Go语言探索 - 7(原创)

    Go语言基础系列博客用到的所有示例代码 在 上一篇文章主要学习了Go语言的函数定义、值传递和引用传递以及闭包函数。...

  • go 零散笔记(未整理)

    go 学习零散笔记 Go语言程序员推荐使用 驼峰式 命名 函数(func) 一个函数的声明由func关键字、函数名...

  • 三、Go的函数

    三、Go的函数 Go语言最少有一个main()函数。 1、Go的函数定义: 2、函数参数 函数如果使用参数,该变量...

  • golang内存逃逸

    一篇很好的博客: Go 语言机制之栈与指针 Go 语言机制之逃逸分析 Go 语言机制之内存剖析 Go 语言机制之数...

  • Go 语言学习技巧和编程思维

    Go 语言学习技巧和编程思维 一、了解 Go 语言 了解 Go 语言背景 学习 Go 语言,首先要了解 Go 语言...

  • Go语言中的函数 为什么是一等公民

    关键点 Go语言中,支持: 普通函数 匿名函数 闭包 在Go语言中,函数属于一等公民(first-class)? ...

网友评论

      本文标题:Go 语言学习之函数

      本文链接:https://www.haomeiwen.com/subject/fmdfqxtx.html