从0开始go语言-8|Go主题月

198 阅读4分钟

函数

函数可以看成是一个可以完成独立功能的代码块,可以反复调用,可以独立完成功能和处理数据,是构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。

函数的定义

代码结构如下:

package mygo 
import "errors" 
func Add(a int, b int) (ret int, err error) { 
if a < 0 || b < 0 { 
 // 假设这个函数只支持两个非负数字的加法
 err= errors.New("Should be non-negative numbers!") 
 return 
 } 
return a + b, nil 
}

函数的主要逻辑是返回传入参数a和参数b的两数之和、和error支持多重返回值。func是关键字,函数名是Add,这个函数名第一个字母需要大写,大写表示包外可见,java中所有的函数首字母都是小写,用修饰符确定该函数的可见性,比如public表示公开的包外可见,private表示仅仅该类里面可以访问,参数列表分别是ab,返回值为reterr,函数体为{}里面的逻辑,返回语句是return语句。

如果参数类型相同,传入的参数和返回参数都可以合并。比如上文传入参数和返回参数都是int的时候。

func Add(a int, b int) (ret int, code int) { 
      //.....
}

简写为:

func Add(a , b int) (ret , code int) { 
      //.....
}

如果只有一个返回值的时候简写如下:

func Add(a , b int)  int { 
      //.....
}

函数调用

函数调用前提导入该函数所在的包,直接写包名称.函数名字(参数1,...)调用。

import "mygo"// 假设我们要调用上文的Add函数,首先的导入Add函数所在的“mygo”的包
//函数调用
c := mymath.Add(1, 2)

注意:像我这种java写习惯的直接写个add()的函数,即使引入包mygo,也会包无法找到add()函数。

规则:牢记小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。此规则也同样适用于类型和变量的可见性。

不定参数

顾名思义不定参数就是传入的参数个数不定,如果需要你设置个不定参数的函数你怎么做呢?容易想到的是把传入的参数用一个可变长度的数组切面存放,函数体循环该数组切片使用每个参数。Go语言的不定参数如下实例:

func myfunc(args ...int) { 
    for _, arg := range args { 
         fmt.Println(arg) 
     } 
}

这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int,所以它可以用如下方式调用:

myfunc(1, 2, 3)
myfunc(1, 3, 5, 9)

像...type格式只能作为函数的类型存在,并且这个参数必须是最后一个参数传递,他是一个语法糖,让你使用起来很方便,如果像我上文那样参数是个数组切片也能实现不定参数传递,但是调用该函数的时候就比较麻烦,必须先初始化一个数组切片把参数放进数组切片容器中,才能调用比较麻烦。

如果你希望传递的参数不指定类型,可以直接写interface{},下面是Go语言中标准库中的fmt.Printf()的函数原型:

func Printf(format string, args ...interface{}) { 
 // ... 
}

多返回值

多返回值我觉的是Go语言函数和其他语言最不同的最特别的所在,这个特性能够使我们写出比其他语言更优雅、更简洁的代码。多返回值很灵性的解决调用函数呆板的问题,反正有多个返回值,选择你需要的返回,不需要的用“_”来跳过这个返回值。简直太香了!

匿名函数与闭包

在Go里面,函数可以像普通变量一样赋值和传递,匿名函数是由一个不带函数名的函数声明和函数体组成。如下:

func(a, b int, c float64) bool { 
    return a*b <int(c) 
}

匿名函数可以直接赋值给一个变量或者直接执行:

f := func(x, y int) int { 
    return x + y 
}

匿名函数实现了闭包的价值,在匿名函数内部的实现对外不可见,实现了闭包的安全性,支持闭包的语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回,在闭包函数中的变量,只有内部的匿名函数才能访问变量,而无法通过其他途径访问到,因此保证了安全性。函数这一节就先到这!打完收工!

备注

本文正在参与「掘金Golang主题学习月」, 点击查看活动详情