山不在高,有仙则名
水不在深,有龙则灵
函数
函数可以说是所有程序的核心,不同的语言之间,函数的定义也不尽相同,大同小异,下面就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
中如果入参为int
、float
等,那么当我们在函数中对入参进行修改时,实际上是传了这个值的一份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;
}
在上面的例子中,我先定义了两个类型的函数--moreParatest
和moreReturnParatest
,这两个函数一个是传入多个参数返回int
,一个是传入两个int
然后返回两个int
返回值的函数,在plus
函数中,将类型直接作为参数传入函数中,这样我们的参数c
和d
就相当于两个函数,在plus
函数中,我们在调用他们,具体函数实现就不去管他。
在plus
函数定义好之后,我们在main
函数中进行调用,由于我们的sum
函数和moreReturnFunc
分别对应满足定义的函数类型,所以直接将该两个函数当作参数传入即可
最终结果如下
30 10
通过这样的方式,我们的程序可以变得非常灵活,特别是在封装接口的时候
网友评论