Go学习笔记(五)

掘金 · · 726 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

(文章持续更新中...有志同道合的人可以一起探讨下。整个系列(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 机制


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:掘金

查看原文:Go学习笔记(五)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

726 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传