• Golang


    本文内容选自:github: Go学习之路(入门教程集合)

    1. 10min语法速学

    不想粘贴教程,但初学真的记不住,来回查找还不如先集中在一起。熟练了再删掉……

    1.1. 错误机制

    error 往往是能预知的错误,但是也可能出现一些不可预知的错误,例如数组越界,这种错误可能会导致程序非正常退出,在 Go 语言中称之为 panic。

    在 Python、Java 等语言中有 try...catch 机制,在 try 中捕获各种类型的异常,在 catch 中定义异常处理的行为。Go 语言也提供了类似的机制 defer 和 recover。

    func get(index int) (ret int) {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Some error happened!", r)
                ret = -1
            }
        }()
        arr := [3]int{2, 3, 4}
        return arr[index]
    }
    
    func main() {
        fmt.Println(get(5))
        fmt.Println("finished")
    }
    

    在 get 函数中,使用 defer 定义了异常处理的函数,在协程退出前,会执行完 defer 挂载的任务。因此如果触发了panic,控制权就交给了defer。

    $ go run .
    Some error happened! runtime error: index out of range [5] with length 3
    -1
    finished
    

    在 defer 的处理逻辑中,使用 recover 使程序恢复正常,并且将返回值设置为 -1,在这里也可以不处理返回值,如果不处理返回值,返回值将被置为默认值 0。


    panic 的一种常见用法是:当函数返回我们不知道如何处理(或不想处理)的错误值时,中止操作。 如果创建新文件时遇到意外错误该如何处理?这里有一个很好的 panic 示例。

    func main() {
    
        panic("a problem")
    
        _, err := os.Create("/tmp/file")
        if err != nil {
            panic(err)
        }
    }
    

    Defer 用于确保程序在执行完成后,会调用某个函数,一般是执行清理工作。

    func main() {
        f := createFile("/tmp/defer.txt")
        defer closeFile(f)
        writeFile(f)
    }
    

    在 createFile 后立即得到一个文件对象, 我们使用 defer 通过 closeFile 来关闭这个文件。 这会在封闭函数(main)结束时执行,即 writeFile 完成以后。

    1.1.1. 总结

    实际上,Golang如此的处理,继承自Google对C++的编程规范——不允许使用 Exception 机制。

    Exception有如下特性:

    • 相比errcode, 具有明确的语义
    • try...catch... 可以实现代码跨层级跳转
    • 通过Exception类继承,可以使用基类捕获不明确的错误类型

    而Golang,由于不允许跳转,所以未实现try模式。panic则是作为第三个目的而实现的。

    2. 常用命令

    • go run xxx.go
    • go build xxx.go
    • go get
    • go install
    • gofmt
    • gRPC

    3. Go Modules & goproxy.cn

    3.1. goproxy.cn

    从 Go 1.11 版本开始,Go 提供了 Go Modules 的机制,推荐设置以下环境变量,第三方包的下载将通过国内镜像,避免出现官方网址被屏蔽的问题。

    $ go env -w GOPROXY=https://goproxy.cn,direct
    

    或在 ~/.profile 中设置环境变量

    export GOPROXY=https://goproxy.cn
    

    3.2. "module" != "package"

    有一点需要纠正,就是“模块”和“包”,也就是 “module” 和 “package” 这两个术语并不是等价的,是 “集合” 跟 “元素” 的关系,“模块” 包含 “包”,“包” 属于 “模块”,一个 “模块” 是零个、一个或多个 “包” 的集合。

    4. 进阶

    大道至简—GO语言最佳实践

    • GO语言关键特性
      • 并发与协程
      • 基于消息传递的通信方式
      • 丰富实用的内置数据类型
      • 函数多返回值
      • Defer延迟处理机制
      • 反射(reflect)
      • 高性能HTTP Server
      • 工程管理
      • 编程规范
    • API框架的实现
    • 公共组件能力
      • 通用列表组件
      • 通用表单组件
      • 协程池
      • 数据校验

    5. 标准库

    • 官方文档
    • 中文解析
      • time
      • sync
      • fmt
      • strconv
      • errors
      • container
      • path
      • net/http
      • net/http/httptest
      • database/sql
      • encoding/json
      • ioutil.ReadFile
      • os.Open
        • fp.Read
      • io.ReadAtLeast
      • bufio
        • NewReader
        • ReadLine
      • bytes
      • reflect
      • context
      • flag - 命令行参数解析

    6. 第三方库

  • 相关阅读:
    bootmgr is conmpressed联想Z485
    数据库中用开窗函数和复制表结构
    左连接新认识
    sql中的日期查询
    一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)
    StarUML安装与Win7不兼容解决
    SQL中VARCHAR与NVARCHAR存储区别
    Cannot start service SPUserCodeV4 on computer
    SQL中空值与NULL区别
    验证码破解分析
  • 原文地址:https://www.cnblogs.com/brt2/p/13269082.html
Copyright © 2020-2023  润新知