
Golang
文章平均质量分 73
Golang 系列技术文章。
范桂飓
AWS Global Community Hero,EdgeGallery 开源社区架构组副主席及秘书处成员,跑步与自行车运动爱好者。
- 2016 年度十大博客之星得主
- 2021 年度十大博客之星得主
- 2022 年度博客新星评委
- 2023 年度博客之星评委
- 2024 年度博客之星评委
展开
-
Go 语言编程系列
目录文章目录目录文章清单文章清单《Go 语言编程 — 安装开发环境》原创 2020-07-04 20:32:58 · 2161 阅读 · 0 评论 -
Golang 编程 — Go Micro 微服务框架
目录文章目录目录Go MicroGo MicroGo Micro 是一个可插拔的 RPC 框架,提供了以下功能:服务发现:程序自动注册到服务发现系统。负载均衡:它提供了客户端负载均衡。同步通信:提供 Request/Response Transport。异步通信:具有内置的发布和订阅功能。消息编码:可以利用 header 中 Content-Type 进行编码和解码RPC 客户端/服务器端:利用上述功能并提供构建微服务需要的接口。Go Micro 架构由三层组成:服务层。C/原创 2020-12-24 13:11:15 · 1815 阅读 · 0 评论 -
Go 语言编程 — gormigrate GORM 的数据库迁移助手
目录文章目录目录前言gormigrate核心结构体实现分析版本定义InitSchemaMigration版本记录(历史)版本升级和回退前言GORM v2gormigrate v2程序 Demo:https://github.com/JmilkFan/gormigrate-demogormigrateGORM 本身提供了 AutoMigrate 功能以及 Migrator 提供的 DDL 接口,但 GORM 更加专注于 ORM 层面,所以在 ORM Schema Version Contro原创 2020-10-11 07:56:22 · 6197 阅读 · 4 评论 -
Go 语言编程 — gorm 数据库版本迁移
目录文章目录目录AutoMigrate示例Migrator 接口(DDL 操作方法)表操作列操作约束操作索引操作数据库版本控制参考文档AutoMigrateGORM 的 AutoMigrate() 方法用于自动迁移 ORM 的 Schemas。所谓 “迁移” 就是刷新数据库中的表格定义,使其保持最新(只增不减)。AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。// 初始化一原创 2020-10-08 21:51:27 · 9353 阅读 · 2 评论 -
Go 语言编程 — gorm 的数据完整性约束
目录文章目录目录实体完整性(主键约束)用户定义完整性(非空约束、唯一约束、检查约束和默认值)参照完整性(外键约束)关联关系一对一、一对多关联多对多关联实体完整性(主键约束)每个关系(表)至少存在一个主键(Primary Key),主键值必须唯一,且不允许为 NULL。type Product struct { gorm.Model Code string `gorm:"primary_key"` Price uint ...}grom.Model 是 GORM 内原创 2020-10-08 11:35:48 · 7363 阅读 · 7 评论 -
Go 语言编程 — validator 数据校验工具
目录文章目录目录ValidatorQuick start约束类型范围约束跨字段约束ValidatorValidator 是一个 Golang 的第三方库,用于对数据进行校验,常用于 API 的开发中,对客户端发出的请求数据进行严格校验,防止恶意请求。Github:https://github.com/go-playground/validator安装:go get gopkg.in/go-playground/validator.v10使用:import "github.com/go-原创 2020-09-27 23:37:20 · 3946 阅读 · 0 评论 -
Go 语言编程 — go-swagger OpenAPI 工具
目录文章目录目录go-swagger参考文档go-swaggergo-swagger 是一个 Golang 的第三方库,是一个 Swagger 2.0(aka OpenAPI 2.0)的 Golang 实现。Github:https://github.com/go-swagger/go-swaggergo-swagger 内含了许多包,其中关键得有:go-openapi:OpenAPI 的 Golang 实现。govalidator:可以对 Golang 的字符串、结构体以及集合进行校验原创 2020-09-12 21:53:56 · 5132 阅读 · 2 评论 -
Go 语言编程 — net 库
目录文章目录目录Socket 编程Socket 编程Socket 编程的流程:建立 Socket绑定 Socket监听 Socket接受连接请求接收数据Golang bulid-in 的 net 库对此流程进行了抽象和封装。无论我们期望使用什么协议建立什么形式的连接,都只需要调用 net.Dial() 即可。net.Dial() 支持的协议类型:tcptcp4tcp6udpudp4udp6ipip4ip6示例:// TCPconn, err := net.原创 2020-08-29 12:58:50 · 1880 阅读 · 0 评论 -
Go 语言编程 — encoding/json 库
目录文章目录目录encoding/json使用 json.Marshal() 函数对一组数据进行 JSON 格式的编码使用 json.Unmarshal() 函数对 JSON 数据进行解码encoding/jsonGolang 提供了的标准库 encoding/json 对 JSON 数据进行编解码,并且允许使用 map[string]interface{} 和 []interface{} 类型的值来分别存放未知结构的 JSON 对象或数组。使用 json.Marshal() 函数对一组数据进行 J原创 2020-08-29 12:57:25 · 2504 阅读 · 3 评论 -
Go 语言编程 — 作用域
目录文章目录目录作用域局部变量全局变量作用域作用域是已声明标识符所表示的常量、类型、变量、函数、或包在源代码中的作用范围(有效性范围)。注意,声明了的局部变量必须被引用,否则会触发异常。全局变量则不需要,因为编译器会考虑该全局变量是否会在其他地方被引用。局部变量在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,形式参数和返回值变量也是局部变量。package mainimport "fmt"func main() { /* 声明局部变量 */ var a, b原创 2020-08-27 22:51:52 · 1578 阅读 · 0 评论 -
急招 Golang 熟手,来做 5G 事业。
内推内推直通车,简历请发送至邮箱:fan.guiju#99cloud.net内推直通车,简历请发送至邮箱:fan.guiju#99cloud.net内推直通车,简历请发送至邮箱:fan.guiju#99cloud.netJD公司:浙江九州云科技信息有限公司,一家全球领先的边缘计算解决方案公司。Base:北京。我们需要你来:参与九州云 4G、5G MEC 边缘计算平台产品的设计与实现。参与九州云 IaaS、CaaS、PaaS 产品的设计与实现。参与九州云 5G 核心网元产品的设原创 2020-08-26 12:51:20 · 2052 阅读 · 0 评论 -
Go 语言编程 — gorm ORM 框架
目录文章目录目录ORM 框架GORMDAO Module 定义表操作记录操作ORM 框架DB APIDriversDAO modulesMigrationGORMGORM 是一个 Golang 的第三方库,一个由国人开源的轻量级 ORM 库。Github:https://github.com/jinzhu/gorm文档:http://gorm.book.jasperxu.com/GORM 的特点:支持 Mysql、PostgreSQL、SQLite、SQLServer。支原创 2020-08-21 20:59:49 · 5099 阅读 · 2 评论 -
Go 语言编程 — go-restful RESTful 框架
目录文章目录目录一个 RESTful API 框架需要什么?go-restful核心概念RouteWebServiceContainer过滤器(Filter)响应编码(Response Encoding)代码示例一代码示例二一个 RESTful API 框架需要什么?从应用程序开发的角度来看,RESTful API 的本质是一个 Web Application,而 RESTful API 框架就是实现这个 Web Application 所封装的一些列工具库,使开发者可以忽略底层实现的复杂度,专注以自原创 2020-08-16 17:00:37 · 8871 阅读 · 1 评论 -
Go 语言编程 — viper 配置管理工具
目录文章目录目录ViperViper 的使用设置默认值读取配置文件监视配置文件,并重新读取配置数据从命令行参数中读取配置从环境变量读取配置ViperViper 是一个 Golang 第三方库,Github:https://github.com/spf13/viper。用于处理 Golang 程序的配置信息,它可以处理多种格式的配置文件。Viper 支持以下特性:为配置项设置默认值。加载并解析 JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件。可以在命令原创 2020-08-16 00:21:37 · 2674 阅读 · 0 评论 -
Go 语言编程 — go mod 依赖包管理
目录文章目录目录go mod 依赖包管理使用 go modgo mod 依赖包管理go mod 是 Golang 1.11 版本引入的依赖包管理工具。其中,Golang 对 Modules 的定义:Modules 是相关 Go Packages 的集合,是源代码交换和版本控制的单元。go 指令支持使用 Modules,包括记录和解析对其他模块的依赖性。Go Modules 替换旧的基于 GOPATH 的依赖管理方式,不再需要包含例如:src,bin 这样的子目录,一个源代码目录甚至是空目录都可以作为原创 2020-08-15 15:10:03 · 3416 阅读 · 0 评论 -
Go 语言编程 — Cobra 指令行工具
目录文章目录目录Cobra(眼镜蛇)Cobra 的核心概念Cobra 的使用Cobra(眼镜蛇)Github:https://github.com/spf13/cobraCobra 是一个第三方 Golang 包,是一个应用程序生成框架,用于创建自己的应用程序或命令行(Command)程序,从而开发以 Cobra 为基础的应用。目前 Docker、Kubernetes、Hugo 等著名项目都使用了 Cobra。Cobra 提供的功能:完全兼容 POSIX 命令行模式。支持嵌套子命令(sub原创 2020-08-15 15:08:07 · 3521 阅读 · 0 评论 -
Go 语言编程 — reflect 反射机制
目录文章目录目录反射机制Struct Tag 与 Reflect反射机制反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行文件。因为可执行文件不存在变量名,所以在程序运行时,就无法通过变量名作为句柄并获取到自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如:结构体信息、字段名称、类型信息等整合到可执行文件中,并给程序提供接口访问这些反射信息,这样就可以在程序运行期间通过接口来获取到变量的反射信息,并且有能力修改它们。S原创 2020-08-14 19:53:42 · 2044 阅读 · 0 评论 -
Go 语言编程 — 使用 delve 进行 DEBUG 调试
目录文章目录目录delvedelveGolang 支持使用 GDB 来进行调试,这与 C 语言几乎是一致的。但 GDB 是一个通用性调试工具,不非常能直接地反映出 Golang 的特点,例如:goroutine 语句的调试。所以,推荐使用 delve(https://github.com/go-delve/delve),可以理解为是 Golang 版本的 GDB,使用方式大致与 GBD 一致。安装:go get -u github.com/derekparker/delve/cmd/dlv测原创 2020-08-12 23:19:34 · 3757 阅读 · 0 评论 -
Go 语言编程 — net/http — 支持 HTTPS
目录文章目录目录前文列表单向认证HTTPS 服务端客户端前文列表《互联网协议 — HTTP 超文本传输协议》《互联网协议 — TLS 1.3 传输层安全协议》《互联网协议 — TLS — 安全四要素与 CA 认证》《互联网协议 — HTTPS 安全的超文本传输协议》单向认证HTTPS 服务端Golang 要实现一个 HTTPS 并不困难,只需要使用 http.ListenAndServeTLS 代替 http.ListenAndServe 即可。前者多出了两个形参:certFile 和 k原创 2020-07-25 00:38:32 · 4919 阅读 · 0 评论 -
Go 语言编程 — net/http — HTTP 服务端
目录文章目录目录HTTP 服务端实现原理注册处理程序和请求路由监听并处理请求支持 httpsHTTP 客户端HTTP 服务端HTTP 服务端同样的,我们可以设想作为 HTTP 服务端处理一次请求应该具备的行为:实现处理函数。预设 URL、Request Method、处理函数,三者之间的路由映射。监听请求。分发请求并完成处理。net/http 将上述行为整合为了两大步骤:注册处理程序和请求路由。监听并处理请求。实现原理注册处理程序和请求路由对于 net/http 而言,HT原创 2020-07-23 00:27:20 · 2087 阅读 · 0 评论 -
Go 语言编程 — net/http — HTTP 客户端
目录文章目录目录net/httpnet/http原创 2020-07-20 21:53:49 · 4076 阅读 · 0 评论 -
Go 语言编程 — 内存分配器与 make 和 new
目录文章目录目录make 和 new为什么建议使用 make 来定义 Slice、Map 和 Channel 变量?make 和 newmake 和 new 都是 Golang 的内置函数,作为用于内存分配的原语(Allocation Primitives),其功能相似,却有着本质的区别。new 用来分配内存,它的第一个参数是一个类型,不是一个值,返回值是一个指向为特定类型新分配的零值填充的内存空间的指针。它并不初始化内存,只是将其置零。// The new built-in function原创 2020-07-20 21:35:09 · 1987 阅读 · 0 评论 -
Go 语言编程 — Context 上下文
目录文章目录目录Goroutine 的控制方式WaitGroupChannel + Select 通知ContextContextContext 的接口Context 的继承衍生Goroutine 的控制方式通常的,Goroutine 协程在启动之后就会 “自顾自” 的完成其任务,大部分情况是等待它自己结束。但实际上,我们常需要对 Goroutine 进行控制,继而完成复杂的并发需求。控制并发,有两种经典的方式,一种是 WaitGroup,另外一种就是 Context。WaitGroupWaitG原创 2020-07-19 22:10:53 · 2086 阅读 · 0 评论 -
Go 语言编程 — panic 和 recover
目录文章目录目录defer,panic 和 recoverpanicrecoverdefer,panic 和 recoverGolang 中常规的错误处理方式是直接 return error 给调用者,再由调用者决定后续的程序逻辑,或捕获、或终止、或恢复。但对于一些无法恢复的错误,返回 error 也没有意义,此时可以考虑使用 panic(惊恐)语句,表示一种自动触发的错误。除了在代码中主动触发 panic,在程序运行的过程中也可能会因为出现某些错误而触发 panic,例如:数组越界。panic 会原创 2020-07-19 19:22:53 · 1920 阅读 · 0 评论 -
Go 语言编程 — 并发 — 同步原语与锁
目录文章目录目录协程锁协程锁协程锁主要用于保证在执行 goroutine 的时候不阻塞 M。举例:任务 A 需要修改 Z,任务 B 也需要修改 Z。如果是串行系统,A 执行完了,再执行B,很简单。在并发系统中,因为 A,B 是并发执行的,所以就需要在操作 Z 的时候确保 A、B 保证串行化的机制。CO_LOCK{ // 处理逻辑}CO_UNLOCKA 要修改 Z,所以 A 加了协程锁。加锁之后,由于处理一些其他的逻辑,例如等待某些事件,又把 CPU 切到 M.g0 调度了原创 2020-07-19 18:42:51 · 1614 阅读 · 0 评论 -
Go 语言编程 — defer 关键字
目录文章目录目录defer 关键字defer 的用途之一:释放资源defer 的用途之二:执行 recover(恢复)多个 defer 的执行顺序被 deferred 函数的参数在 defer 时确定被 defer 的函数可以读取和修改带名称的返回值defer 关键字go 用 defer(推迟)关键字来延迟执行指定的函数,比如:func a() int { defer b() return 0}函数 b() 发生在 return 0 之后,可见 defer 关键字会将指定的函数延迟到 re原创 2020-07-19 18:35:32 · 1600 阅读 · 0 评论 -
Go 语言编程 — 内存分配
目录文章目录目录内存分配参考文档内存分配程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域 — 栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理。不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由开发者主动申请和释放内存,Go 以及 Java 等编程语言会由开发者和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。参考文档https://mp.weixin.qq.com/s原创 2020-07-19 00:50:03 · 1582 阅读 · 0 评论 -
Go 语言编程 — GC 垃圾回收
目录文章目录目录GC常见的 GC 实现方式参考文档GCGC(Garbage Collection,垃圾回收)是一种自动内存管理的机制。相对于 C、C++ 以及 Rust 等编程语言使用手动的方式管理内存。当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程原创 2020-07-19 00:45:26 · 2084 阅读 · 0 评论 -
Go 语言编程 — GPM 与 CSP 高并发模型
目录文章目录目录并发和并行如何交互?CSP 通信模型如何调度?MPG 调度模型用户级线程模型(多对一)内核级线程模型(一对一)两级线程模型(多对多)MPG 线程模型Go Runtime Scheduler使用 GODEBUG 查看 Go Runtime Scheduler 的状态信息并发和并行并发和并行的目的都是为了充分利用 CPU 的多核(多处理器)架构,但两者却有着本质的区别。并发:在同一时间段内,多条指令在 CPU 上执行。并行:在同一时刻内,多条指令在 CPU 上执行。并发程原创 2020-07-18 21:26:45 · 3202 阅读 · 1 评论 -
Go 语言编程 — 并发 — Channel 通道
目录文章目录目录Channel通道缓冲区遍历通道与关闭通道Channelchannel(通道)是用来传递数据的一个数据结构。通道可用于两个 goroutine 之间通过传递一个指定类型的数值,以此来同步运行及通讯。操作符 <- 用于指定通道的方向,根据位置的不同表示发送或接收。如果未指定方向,则为双向通道。ch <- v // 把 v 发送到通道 chv := <-ch // 从 ch 接收数据并把值赋给 v使用 chan 关键字来定义一个通道变量:ch := m原创 2020-07-18 12:11:44 · 1783 阅读 · 0 评论 -
Go 语言编程 — 性能分析
目录文章目录目录ProfilingruntimeMemStatGCpproftraceDEBUGProfilingGolang 提供了友好的工程化支持,其中之一就是 Profiling(分析)工具。例如:Golang 自带的 runtime 包,就可以轻松获取程序运行期间的各种内存或 CPU 的使用状态信息。runtimeMemStat查看内存使用情况:package mainimport ( "fmt" "runtime")func main() { var m runtim原创 2020-07-17 17:59:20 · 2292 阅读 · 0 评论 -
Go 语言编程 — 编码规范指南
目录文章目录目录一个项目使用单个 GOPATHimport 规范代码风格一个项目使用单个 GOPATHGOPATH 指定了 Golang 项目的 Workspace,Golang 是支持多 GOPATH 的,也就是说:在同一个 Golang 项目中可以同时拥有多个运行环境。多 GOPATH 支持带来了一定的灵活度,但也会导致某些副作用,例如:软件版本的一致性。诸如 Etcd 或 Camlistore 这样的大项目通常会使用 godep 类似的依赖包管理工具,将所有依赖都保存到某个目录中。也就是说,这原创 2020-07-11 22:11:43 · 3224 阅读 · 0 评论 -
Go 语言编程 — go 常用指令
目录文章目录目录go 指令go run 试运行go build 编译go install 安装go get 下载并安装go test 测试go env 环境变量go fmt 格式化源代码go 指令Golang 本身就是一个程序,包含了编译器以及一些辅助指令。go run 试运行go run 会快速执行指定的 .go 源码文件,不会生成二进制文件,常用于试运行代码。go build 编译go build 用于便于 Golang 程序的源码,生成二进制文件。go install 安装当我们编写原创 2020-07-11 18:13:07 · 3058 阅读 · 0 评论 -
Go 语言编程 — 项目布局规范
目录文章目录目录项目布局(Project Layout)程序核心代码目录/cmd(Command)/internal/pkg(Package)/vendor常规目录/configs/init/scripts/build/deployments/testService(服务端)应用目录/apiWeb 应用目录/web其他目录/docs/tools/examples/third_party/githooks/assetswebsite不建议使用的目录/src项目布局(Project Layout)注意,本原创 2020-07-11 16:12:48 · 3057 阅读 · 0 评论 -
Go 语言编程 — 错误处理
目录文章目录目录异常处理异常处理Golang 通过内置的 error interface(错误接口数据类型)提供了非常简单的错误处理机制。error interface 的定义:type error interface { Error() string}在代码中,可以通过实现 error 接口类型来生成错误信息。函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息:func Sqrt(f float64) (float64, error) {原创 2020-07-06 18:45:59 · 2036 阅读 · 0 评论 -
Go 语言编程 — 并发 — Goroutine 协程
目录文章目录目录goroutinechannel通道缓冲区遍历通道与关闭通道goroutineGolang 原生支持并发,体现在 Golang 提供了 go 关键字。格式:go 函数名(形参列表)go 语句会直接开启一个新的运行期线程,即:goroutine。以一个不同的、新创建的 goroutine 来执行一个函数。goroutine 的本质是一个轻量级线程,goroutine 的调度由 Golang 运行时进行管理, 同一个程序中的所有 goroutine 共享同一个地址空间。packa原创 2020-07-06 18:29:22 · 1848 阅读 · 0 评论 -
Go 语言编程 — 数据类型转换
目录文章目录目录数据类型转换数据类型转换类型转换用于将一种数据类型的变量转换为另外一种类型的变量。格式:type_name(expression)以下实例中将整型转化为浮点型,并计算结果,将结果赋值给浮点型变量:package mainimport "fmt"func main() { var sum int = 17 var count int = 5 var mean float32 mean = float32(sum) / float3原创 2020-07-06 18:02:17 · 1650 阅读 · 0 评论 -
Go 语言编程 — 高级数据类型 — Interface、多态、Duck Typing 与泛式编程
目录文章目录目录接口接口接口是 Golang 提供的一种数据类型,使用 type 和 interface 关键字来声明。接口可以把所有的具有共性的方法(Method)集合在一起,任何其他类型只要实现了这些方法就是实现了这个接口。格式:/* 定义接口 */type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type]原创 2020-07-06 17:59:59 · 2568 阅读 · 0 评论 -
Go 语言编程 — 高级数据类型 — Map 集合
目录文章目录目录集合定义 Mapdelete() 函数实现简单 HashMap集合集合(Map)是一种无序的键值对集合。通过 key 来快速检索数据,key 类似于索引,指向数据的值。可见,Map 数据类型类似于 Python 的字典数据类型,但封装程度较低。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,所以我们无法决定它的返回顺序,这是因为 Map 是使用 HASH 表来实现的。定义 Map可以使用内建函数 make 也可以使用 map 关键字来定义 Ma原创 2020-07-06 17:49:55 · 1687 阅读 · 0 评论 -
Go 语言编程 — 高级数据类型 — Slice 切片
目录文章目录目录切片空切片切片截取len() 和 cap() 函数append() 和 copy() 函数切片Golang 中,切片(Slice)是对数组的抽象。数组的长度是不可改变的,所以需要一种灵活,长度是不固定的 “数组”,可以追加元素。这就是切片数据类型,也称为 “动态数组”。可以声明一个未指定大小的数组来定义切片,切片不需要说明长度:var identifier []type// ors := []int {1, 2, 3}或使用 make() 函数来创建一个切片:var s原创 2020-07-06 15:04:13 · 1636 阅读 · 0 评论