• Go语言异常处理机制

    Go 语言程序错误分为两种: error ,程序员可以预料到的,安错误种类加以处理; panic ,无法预料到的; 典型原因 引起 panic 的常见操作包括: 数组越界访问 类型断言失败 访问空指针 互斥锁错误调用 向已关闭的 channel 发送数据 etc 越界异常 很多初级程序员经常这样访问数组或切片的最后一个元素: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package main import ( "fmt" ) func main() { names := []string{ "lobster", "sea urchin", "sea cucumber", } fmt.Println("My favorite sea creature is:", names[len(names)]) } len 计算元素总数,但由于元素下标是从 0 开始的,最后一个元素下标应该是 len(names)-1 。例子中的程序员忘了减一,因此 Go 程序会抛出越界异常。
    阅读全文
  • 基于反射的Go依赖注入工具——dig

    dig 是 uber 开源的一个依赖注入组件,内部基于反射实现,适用于: 为程序框架(如 Fx )提供依赖注入能力; 在进程启动阶段,解决对象依赖图; 但不适用于以下场景: 它只提供依赖注入功能,无法替代程序框架(如 Fx ); 在进程启动阶段后的依赖解决; 作为服务发现组件,暴露给其他用户代码; 安装 开始使用 dig 解决依赖问题前,我们需要先安装,推荐安装主版本 1 : 1 2 3 $ glide get 'go.uber.org/dig#^1' $ dep ensure -add "go.uber.org/dig@v1" $ go get 'go.uber.org/dig@v1' Container dig 提供了一容器( container ),来解决有向无环图式依赖。调用 New 函数即可创建一个容器: 1 c := dig.New() 程序组件间的依赖关系是一个有向图,边指向被依赖组件。通常程序不允许循环依赖,这意味着图不能有环,因此是一个有向无环图。 Provide dig 容器负责管理依赖关系,并接管了对象创建工作。因此,我们必须告诉 container 每个数据类型分别应该如何创建。这通过 Container 提供的 Provide 方法来进行。 Provide 方法接收一个构造器函数作为参数,该函数负责具体数据类型的创建和初始化,并将其返回。如果待创建的数据类型依赖其他类型,可以将依赖作为构造函数参数来声明。
    阅读全文
  • Linux系统下Go语言编程环境安装,快速起步!

    二进制包 Linux 下,推荐通过二进制包部署 Go 语言开发环境。首先,从 Go 官网 下载页面 下载二进制包。 下载完毕后,将压缩包解压到家目录的 opt 目录中,以 1.10.3 版本为例: 1 2 $ mkdir -p ~/opt $ tar -xf go1.10.3.linux-amd64.tar.gz -C ~/opt 解压完毕后,我们可以看到这些目录和文件: 1 2 3 $ ls ~/opt/go api bin CONTRIBUTING.md doc lib misc pkg robots.txt test AUTHORS blog CONTRIBUTORS favicon.ico LICENSE PATENTS README.md src VERSION 其中, Go 语言开发工具就位于 bin 目录下。 尝试运行 go 命令: 1 2 $ ~/opt/go/bin/go version go version go1.
    阅读全文
  • Go语言包简介

    每个 Go 程序都是由一些包组成的,程序从 main 包中的 main 函数开始执行。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    package main
    
    import (
        "fmt"
        "math/rand"
    )
    
    
    func main() {
        fmt.Println("My favorite number is", rand.Intn(10))
    }
    

    在这个程序,通过 import 导入两个包, fmtmath/rand (包路径)。

    阅读全文
  • Go语言学习资料

    官方文档

    免费资料

    Go by Example

    Go by Example 是一个 Go 语言 动手实践 教程,提供大量 例子 并附带 注释

    阅读全文
  • Go语言函数入门

    Go 语言中,函数可以接受零或多个参数:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    package main
    
    import "fmt"
    
    func add(x int, y int) int {
        return x + y
    }
    
    func main() {
        fmt.Println(add(43, 13))
    }
    

    在这个例子中, add 函数接受两个 整型int )参数。注意到,类型申明紧跟在参数名之后,这跟其他语言有些区别。

    阅读全文
  • Go语言变量概述

    var 语句 申明declare )变量列表; 跟 函数 参数列表一样,类型在最后指定。

    var 语句的作用域(可见范围)可以是 包级别 或者 函数级别 。 下面这个例子同时包含这两种级别:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    package main
    
    import "fmt"
    
    var c, python, java bool
    
    
    func main() {
        var i int
        fmt.Println(i, c, python, java)
    }
    

    作用域是啥意思呢?

    阅读全文
  • Go语言基本类型

    Go 内置了以下基本类型:

    • 布尔
      • bool
    • 字符串
      • string
    • 整数
      • int int8 int16 int32 int64
      • uint uint8 uint16 uint32 uint64
    • 字节
      • byteuint8 的别名
    • Unicode
      • runeint32 的别名
    • 浮点
      • float32 float64
    • 复数
      • complex64 complex128
    阅读全文
  • Go语言常量定义

    常量( constant )申明与变量一样,只不过换成 const 关键字。常量可以是字符、字符串、布尔,或者数值类型。另外,常量不能使用 := 语法申明。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    package main
    
    import "fmt"
    
    const Pi = 3.14
    
    func main() {
        const World = "世界"
        fmt.Println("Hello", World)
        fmt.Println("Happy", Pi, "Day")
    
        const Truth = true
        fmt.Println("Go rules?", Truth)
    }
    
    阅读全文
  • Go语言for循环语句

    Go 语言只有一种循环结构—— for 循环。

    最基本的 for 语句包含 3 部分,以分号 ; 分隔:

    • 初始语句 :在第一次迭代判断之前;
    • 条件语句(表达式) :在每次迭代前求值并判断;
    • 迭代后语句 :在每次迭代后执行;
    1
    2
    3
    
    for 初始语句; 条件语句; 迭代后语句 {
        代码体
    }
    

    当条件表达式求值为 false 时,循环将停止迭代并退出。

    阅读全文