-
利用Golang泛型特性优化MongoDB操作封装
本文讨论如何在 Golang 中,使用泛型化编程思想优化 MongoDB 查询操作,减少重复性代码,提升开发效率。 数据表 为对比不同设计思路的实际效果,我们设计了一个极简的用户任务场景,涉及 2 张表。 用户表 用户表记录系统可登录用户的信息,字段如下: 1 2 3 4 5 6 7 8 9 type User struct { Id primitive.ObjectID `bson:"_id" json:"Id"` Uid string `bson:"Uid" json:"Uid"` // 登录账号,如:lurenjia Name string `bson:"Name" json:"Name"` // 姓名,如:路人甲 Email string `bson:"Email" json:"Email"` // 工作邮箱,如:lurenjia@xxxx.com // 其他字段... } Id ,MongoDB 主键; Uid ,用户账号,类型为字符串,如 fasionchan ; Name ,用户姓名,类型为字符串,如 小菜 ; Email ,工作邮箱,类型为字符串,如 fasionchan@gmail.com; 辅助类型定义 为了方便数据处理,我们可以为结构体实现一些方法,例如获取用户账号 Uid :阅读全文 -
Go语言异常处理机制
阅读全文Go 语言程序错误分为两种:
- error ,程序员可以预料到的,安错误种类加以处理;
- panic ,无法预料到的;
典型原因
引起 panic 的常见操作包括:
- 数组越界访问
- 类型断言失败
- 访问空指针
- 互斥锁错误调用
- 向已关闭的 channel 发送数据
- etc
-
基于反射的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'
-
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.10.3 linux/amd64
至此, Go 已经安装完毕!但等等!
~/opt/go/bin/go
这是什么鬼? -
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 导入两个包, fmt 和 math/rand (包路径)。
-
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
- 字节
- byte ,uint8 的别名
- Unicode
- rune ,int32 的别名
- 浮点
- 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) }