go基础_unit3_构建块
Unit3-构建块
1、函数
1.1、函数声明
声明函数时使用形参;调用函数时使用实参
首字母小写的函数只能在声明该函数的包中使用,而首字母大写的函数会被导出并为其他包所用
函数声明中带省略号
...
代表该函数是一个可变参数函数,可以接受任意多个实参函数声明时参数可以是多个:
func Unix(sec int64, nsec int64) Time
如果多个参数类型相同,则该类型只写一次即可:func Unix(sec, nsec int64) Time
- 调用:
func := time.Unix(12622780800, 0)
函数声明时返回值可以是多个:
func Atoi(i string)(i int, err error)
函数的多个返回值需要用括号括起来,每个返回值名字在前,类型在后。声明函数时可以把名字去掉,只保留类型:
func Atoi(i string)(int, error)
可变参数函数:例如
Println
- 该函数声明为:
func Println(a ...interface{})(n int,err error)
...
表示函数参数的数量是可变的- 参数a的类型为interface{},是一个空接口
- 该函数声明为:
小测验:温度单位转换
1 | package main |
2、方法
2.1、声明新类型
- 关键字type可以用来声明新类型
- type celsius float64
- var temp celsius = 20
2.2、通过方法添加行为
- 在Go里,提供了方法,但没有提供类和对象
1 | type kelvin float64 //声明类型 |
- 方法就像跟特定类型相关联的函数,其中被关联的类型将通过方法名前面的接收者来指定。
练习:编写一个程序,使它带有celsius、fahrenheit和kelvin这三种类型以及在这三种温度类型间相互转换的方法
1 | package main |
3、一等函数
在Go里,函数是头等的,它可以用在整数、字符串或其他类型能用的地方:
- 将函数赋给变量
- 将函数作为参数传递给函数
- 将函数作为函数的返回类型
3.1、将函数赋给变量
1 | package main |
- 变量sensor是一个函数,而不是函数执行的结果
- 无论sensor的值是fakeSensor还是realSensor,都可以通过sensor()来调用
- sensor这个变量的类型是函数,该函数没有参数,返回一个kelvin类型的值
3.2、将函数传递给其它函数
1 | package main |
- messTemp函数接受两个形参,其中第二个形参的类型为
func() kelvin
3.3、声明函数类型
- 为函数声明类型有助于精简和明确调用者的代码
- 例如:
type sensor func() kelvin
- 所以:
func meaTemp(samples int, s func() kelvin)
- 可以精简为:
func meaTemp(samples int, s sensor)
- 例如:
3.4、闭包和匿名函数
匿名函数就是没有名字的函数,在Go里也称作
函数字面值
匿名函数三种类型:
var f = func(){ fmt.Println("kkkkk") } func main(){ f() // 加小括号执行函数 }
1
2
3
4
5
6
7
8
- ```go
func main(){
f := func(message string){ //匿名函数赋值给变量
fmt.Println(message)
}
f("kkkkkkk")
}//匿名函数声明后立即执行 func main(){ func(){ fmt.Println("kkkkk") }() //直接加小括号执行 }
闭包现象:内层函数里面用到了它上一层函数里面的变量或一些东西,这个内层函数就叫做
闭包函数
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Summer 自习室!