跟着猫哥学Golang[8] - 函数

所有编程语言都有函数的概念。Golang里面,函数有些特殊。

1. 首先,函数也是值。

函数可以拿来当参数,当变量,当... 这些猫哥第一遇到的时候是在JavaScript里。没想到在Golang里又遇到了。感觉Go借鉴了C,借鉴了JavaScript,然而是一种脚本语言。抑或无名函数类似Python中的 lamda?

来看个例子:

package main

import "fmt"

func main() {
	myarea := func(x, y float32) float32 {
				return (x*y)
			}
	fmt.Println(myarea(1.1, 2.2))
}

// 输出: 
2.42

必须说明的两点:

1) Golang没有float类型,或者float32 或者 float64,只能二选一。

2)如果例子里的类型换成float64,那么结果会是很诡异的 2.4200000000000004 。猫哥在 go1.5.1 windows/amd64上实验的结果。末尾的4不知道怎么出来的。
 

2. 函数是完全闭包的。

来看一个精心构造的例子(参考了《Go语言半小时速成教程》的一段代码):

 

package main

import "fmt"

func adder() func(int) int {
	sum := 1
	return func(x int) int {
		sum *= x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()
	for i:=1; i<5; i++ {
		fmt.Println(
			pos(i),
			neg(-1*i),
		)
	}
}

// 输出结果:
1 -1
2 2
6 -6
24 24

 

两个函数的执行互不影响,完全各干各的。

 

3. golang函数可以有多个返回值。

这一点应该是足以让C语言程序员们羡慕不已的了,Perl程序员们笑而不语路过...

第一个例子的小小变形:

package main

import "fmt"

func myfunc (x, y int) (circle, area int) {
	return (x+y)*2, x*y
}

func main() {
	mylength, myarea := myfunc(4, 6)
		
	fmt.Println(mylength)
	fmt.Println(myarea)
}

//输出:
20
24

4. 函数的作用当然远远不止于此,还记得之前谈到过的结构体(struct)吗?Golang让结构体和函数配合,产生了新的功能。当然了,和结构体配合,函数就不再叫函数,而改成——方法(method)。后面会讲到的。

 

5. Golang的函数可以接受可变参数的例子,其实最开始就遇到了。
比如: fmt.Println("hello" , "world!")
写出来,看起来这样的:
func variousPara(paras ... interface{}) {
	fmt.Println(paras)
	fmt.Println(reflect.TypeOf(paras))
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值