(文章持续更新中...有志同道合的人可以一起探讨下。整个系列(1~8)准备重写,不过都是很基础的入门笔记,想学到很深入的东西则不建议阅读...)
函数是实现一些功能的代码块,可以提高应用的模块性和复用率。
题外话,React的组件化也是为了代码复用,组件可以看作一个函数,Props是外部传参,state是函数内部状态或者内部变量。
普通函数需要先声明才能调用。同一个包内,函数不能同名。支持多返回值
包(package)是 Go 源码的一种组织方式,一个包可以认为是一个文件夹。
Go 语言的函数声明以 func 标识,后面紧接着函数名、参数列表、返回参数列表及函数体
func foo( a int, b string ){
... // 函数体
}
复制代码
参数列表中,如有多个参数变量,则以逗号分隔,如果相邻变量是同类型,则可以将类型省略
func add(a, b int) int {
return a + b
}
// 函数可以有多个返回值
conn, err := connectToNetwork()
复制代码
闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。
Go语言支持可变参数特性,函数声明和调用时没有固定数量的参数.
func 函数名(固定参数列表, v … T)(返回参数列表){
函数体
}
复制代码
Go 语言的 defer 语句会将其后面跟随的语句进行延迟处理。在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。压栈出栈的原因。
package main
import (
"fmt"
)
func main() {
fmt.Println("defer begin")
// 将defer放入延迟调用栈
defer fmt.Println(1)
defer fmt.Println(2)
// 最后一个放入, 位于栈顶, 最先调用
defer fmt.Println(3)
fmt.Println("defer end")
}
复制代码
Go语言函数处理思想
- 一个可能造成错误的函数,需要返回值中返回一个错误接口(error)。如果调用是成功的,错误接口将返回 nil,否则返回错误
- 在函数调用后需要检查错误,如果发生错误,进行必要的错误处理。
net.Dial() 是 Go 语言系统包 net 即中的一个函数,一般用于创建一个 Socket 连接。net.Dial 拥有两个返回值,Conn 和 error
func Dial(network, address string) (Conn, error) {
var d Dialer
return d.Dial(network, address)
}
复制代码
手动触发宕机
Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失
package main
func main() {
panic("crash")
}
// 程序崩溃,输出内容如下
panic: crash
goroutine 1 [running]:
main.main()
F:/src/tester/main.go:5 +0x6b
复制代码
Go语言提供宕机恢复功能,防止程序崩溃。Go 没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,那么 recover 的宕机恢复机制就对应 try/catch 机制
有疑问加站长微信联系(非本文作者)