Echo 系列教程——定制篇0:让 Echo 更强大、更好用

一个强大的框架,一定是可以定制的,或者说可以扩展,能够根据用户自己的需求进行改变、增强,甚至某些功能的替换。作为一个强大的框架,Echo 必然也是可以定制、可以扩展的。本篇起,我们一起探讨如何对 Echo 框架进行定制或扩展,打造成符合你个性需求的框架。 定制化主要包含如下一些方面: 自定义 Binder,用来处理 Request 数据绑定 自定义 Validator,用来处理输入验证 自定义 Lo

欢迎加入 GoLand 2020.1 抢先体验计划

GoLand 2020.1 抢先体验计划已经启动。对于此发行版,我们着重于易用性,性能以及减少浪费在样板代码和 IDE 中的冗余操作上的时间。我们还包括对 Go Modules 支持的升级,和其他更多功能。您可以在 2020.1 的路线图博客 文章中找到简短说明。 你可以通过 Toolbox App 获得它,也可以从网站上下载 ,也可以使用快照包(对于 Ubuntu);或者直接在 GoLand 中通过自动更新的方式获取。Preferences / Settings | Appearance & Behavior | System Settings | Updates。 如果您想知道什么是抢先体验计划,这里有一个简短的解释: EAP 版本使您可以试用 Goland 仍在开发中的最新功能和增强功能。这些版本尚未经过全面测试,可能会不稳定,但是您可以在这里为我们提供帮助。通过将这些内部版本和功能用于实际项目和场景中来测试,您可以帮助我们完善它们。这样,当最终版本准备就绪时,它将为您更好地工作。 EAP 使您可以首先试用所有最新功能; 自构建日期起 30 天内免费使用 EAP 版本。您可以将这段时间用作 GoLand 的扩展试用版; 我们会提供 EAP 版本,直到几乎可以发布稳定版本为止。对于即将推出的 2020.1 版本,EAP 期将大致持续到 3 月底; 在每个发布周期中,我们都会为他们提供免费的 1 年 GoLand 订阅和一件独家的 GoLand T 恤 ,以表彰他们中最活跃的评估人员。 此外,我们几乎每天都提供最新版本。因此,如果您不想等待正式的 EAP 版本公告,则只需下载这些夜间版本之一,即可通过 Toolbox App 获得。请注意,每晚构建的质量通常低于我们的标准,并且没有随附发行说明。与 EAP 版本一样,它们也将在发布后 30 天内过期; 因此,让我们看一下第一个 EAP 版本中包含的内容。 Go Modules 现在,您可以通过 go.mod 文件中的 Alt-Enter 来获取缺失的依赖项并删除未使用的依赖项。 Go 1.14 支持 Go 1.14 增加了对嵌入重叠接口的支持,我们也是如此!当您使用重叠的接口时,GoLand 不会将重复的方法报告为错误。 为什么将此功能添加到语言中? 主要好处是我们可以使用嵌入定义接口,而不需要手动定义。这是一个例子: type Person interface { Name() string String() string } type Employee interface { Person Department() string String() string } 在 Go 1.14 之前,我们无法在 Employee 接口上添加 String() 方法,因为该方法已在 Person 接口上定义了。现在,我们可以使用接口嵌入定义它,如果 Person 接口有更新,我们自己更可控。 代码补全/完成增强 我们对样板代码说不!GoLand 为常见的错误处理模式添加了代码完成功能。现在,当您在函数中键入if 时,您可以选择 err!= nil {…} 以自动完成它。 为了更快地定义接口和结构,现在,当您键入type 关键字时,IDE 会为它们建议模板。当您输入 interface 或 struct 时,将显示相同的补全内容。 现在,根据格式设置规则的要求,Fill Fields 操作会在冒号后添加空格,并在复合文字中的语句末尾添加逗号。 现在,当您使用 map 时,完成键类型后,代码补全将光标移到右括号后面。 智能代码补全建议使用指向结构的指针。 最终,代码补全变得更加智能,现在在断言和 type-switch-case 中会首先建议兼容类型。 代码编辑增强 当编写多值返回函数的签名时,GoLang 2020.1 将在逗号后面的返回类型周围自动添加括号。 此外,当您在字符串中粘贴一些文本时,GoLand 会自动转义双引号。 Postfix 完成模板 .else Postfix 完成模板可以快速添加 if 语句,以检查表达式是否为假。 实时模板 我们添加了新的 consts, vars, types, 和 import 模板 。对于这些模板,默认情况下,GoLand 将在表达式周围添加括号。 fori 模板插入经典 for 循环的样板代码。 重构 现在,即使接口定义中省略了参数名称,Implement Methods(在 macOS 和 Windows/Linux 上为 Ctrl + I)也允许您指定参数名称。

Echo 系列教程——基础篇3:通过一个例子串联各特性

通过前面的介绍,相信对 echo 有了一个初步的认识。本文我们通过一个简单的登录页面来串联 echo 的相关特性。因为该文主要关注各个特性,所以在目录结构和代码组织方面很随意。 本节最终效果 1)登录页面 2)登录失败 3)登录成功 main 函数骨架 使用 echo 框架,在程序入口处一般包含如下内容: func main() { // 创建 echo 实例 e := echo.New() // 配置日志 configLogger(e) // 注册静态文件路由 e.Static("img", "img") e.File("/favicon.ico", "img/favicon.ico") // 设置中间件 setMiddleware(e) // 注册路由 RegisterRoutes(e) // 启动服务 e.Logger.Fatal(e.Start(":2019")) } 日

更懂 module 的包资源中心:关于 pkg.go.dev 的前世今生和未来

北京时间 2019 年 11 月 14 日凌晨 1 点 16 分,Go 官方团队在 golang-nuts 邮件组宣布 go.dev 上线,这是一个新的 Go 开发人员中心。具体的介绍可以看我之前发布的文章 大家用Go都做什么?Go官方新发布的 Go.Dev 告诉你 。同时,go.dev 还提供了一个 Go 软件包和模块的新信息资源中心:pkg.go.dev,而在此之前,Go 已经存在了一个包资源网站:godoc.org。2020 年 1 月 31 日,在 Go 官方博客又发布了

Echo 系列教程——基础篇2:Echo 核心亮点介绍

在 Echo 的官网的首页,列出了 9 个核心功能或亮点。我这里将它说成是亮点(也许并不一定都比其他框架更好)。 一、优化的路由 高度优化的 HTTP 路由,动态内存分配为零,可对路由进行优先级排序。 这一点从上一篇:[搭建 Echo 开发环境](基础篇:搭建 Echo 开发环境.md) 可以看到。 Echo 路由基于 radix tree ,查询速度非常快。路由使用 sync pool 来重用内存,实现无 GC 开销下的零动态内存分配。 路由的注册和使用方式 各大

Echo 系列教程——基础篇1:搭建 Echo 开发环境

工欲善其事必先利其器。我们先搞定 Echo 环境。 Go 开发环境 这个系列基于 Go1.14.4,Linux 系统。 安装 Go 的方式有很多,可以在这里 https://studygolang.com/dl 下载对应操作系统的版本。我自己比较喜欢通过源码安装。我将我的方式告诉大家。(Windows 环境比较建议直接下载对应的包进行安装 https://studygolang.com/dl/golang/go1.14.4.windows-am

Echo 系列教程——Go 语言 Web 框架 Echo 系列教程

大家好,从今天起,我们一起来学习 Echo 框架。 这几年,随着 Go 语言的发展,各种 Web 框架也出现了。常言道:没有选择是一种无奈,有选择是一种痛苦。所以,大家总是问:Web 框架大佬推荐哪个? 这一年,国内推荐 Gin 的人很多,也让 Gin 的 Star 数增加到了 32k+(2019-10-17),网络上 Gin 相关的教程也很多。总体来说,Gin、Echo 等都比较轻量,易用性也差距不大,而 Gin 最大的一个优势是

Go1.18 已经发布,通过例子学习泛型 大家好,我是 polarisxu。 Go1.18 已经发布,泛型也正式面世。也许你不一定要得到泛型,但还是有必要学习下。之前我出过两个泛型相关的教程,没有看的可以看看。 Go 泛型入门教程 跟着 Go 作者学泛型 今天通过另外一种方式学习泛型,即具体的例子,建议可以实际动手试验这些例子,同时也领会一下泛型的使用场景。 求最小值、最大值 直接上代码: package main import ( "fmt" "golang.org/x/exp/constraints" ) func max[T constraints.Ordered](s []T) T { if len(s) == 0 { var zero T return zero } m := s[0] for _, v := range s { if m < v { m = v } } return m } func min[T constraints.Ordered](s []T) T { if len(s) == 0 { var zero T return zero } m := s[0] for _, v := range s { if m > v { m = v } } return m } func main() { fmt.Println(min([]int{10, 2, 4, 1, 6, 8, 2})) fmt.Println(max([]float64{3.2, 5.1, 6.2, 7.6, 8.2, 1.5, 4.8})) } 注意,golang.org/x/exp/constraints 这个包是实验性的,生产环境代码建议定义自己的一套。 因为要进行大小比较,所以对泛型 T 做了类型约束:constraints.Ordered,只有可进行大小比较的类型才符合类型 T。 2、泛型版 slice 包含函数 标准库中,对字符串、字节数组实现了相关的函数,进行包含判断:strings.Contains 和 bytes.Contains。那对其他基本类型怎么办?比如判断一个 int 是否在一个 int slice 中呢?得自己实现一个。 有了泛型,可以来一个泛型版本: package main import "fmt" func contains[T comparable](elems []T, v T) bool { for _, s := range elems { if v == s { return true } } return false } func main() { fmt.Println(contains([]string{"a", "b", "c"}, "b")) fmt.Println(contains([]int{1, 2, 3}, 2)) fmt.

用 Go 进行系统编程 大家好,我是站长 polarisxu。 今天起我们开始一个系列:用 Go 进行系统编程,主要介绍系统编程相关的知识。 01 准备 本系列教程基于 Unix 系统(更确切是 Linux 系统),如果你使用的是 Windows 系统,请安装 Windows Subsystem for Linux(WSL)。安装步骤如下: 以管理员身份打开 PowerShell,运行如下命令: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 按提示重启电脑; 根据你的喜好从 Microsoft Store 安装 Linux distribution; Go 语言版本基于最新的 Go1.16。 02 什么是系统编程(System programming) 维基百科的解释 : 系统编程是指从事计算机系统软件的编码活动。 那什么是系统软件呢?维基百科的解释 : System software is software designed to provide a platform for other software. 即服务于其他软件的软件就是系统软件,比如操作系统、游戏引擎、工业自动化等。相应的,面向用户的就是应用软件了。(有时界限没那么清晰) 系统编程是 Unix计 算机上编程的一个特殊领域。请注意,系统编程不限于 Unix 计算机,只是这个系列主要关注 Unix 系统。大多数与系统管理任务有关的命令,例如磁盘格式化,网络接口配置,模块加载和内核性能跟踪,都是使用系统编程技术来实现的。此外,可以在所有 Unix 系统上找到的 /etc 目录包含纯文本文件,这些文本文件处理 Unix 机器及其服务的配置,并且也可以使用系统软件进行操作。 一般可以将系统软件的各个领域和相关的系统调用分为以下几组: 文件 I/O:这部分处理文件读取和写入操作,这是操作系统最重要的任务。文件输入和输出必须快速高效,并且最重要的是要可靠。 高级文件 I/O:除了基本的输入和输出系统调用之外,还有其他更高级的方法来读取或写入文件,包括异步 I/O 和非阻塞 I/O。 系统文件和配置:这些系统软件允许处理系统文件(例如 /etc/passwd)并获取系统特定信息(例如系统时间和 DNS 配置)等。 文件和目录:这部分包括函数和系统调用,它们允许程序员创建和删除目录并获取信息,例如文件或目录的所有者和权限。 进程控制:可以创建 Unix 进程并与之交互; 服务器进程:这套工具包括允许您开发服务器进程的技术,这些服务器进程是在后台执行而无需活动终端的进程。 Go 并不能很好地以传统的 Unix 方式编写服务器进程。诸如 Apache 之类的 Unix 服务器使用 fork(2) 创建一个或多个子进程(此过程称为 fork,是指从父进程克隆一个子进程),并从同一点继续执行相同的可执行文件,最重要的是,共享内存。尽管 Go 不提供与 fork(2) 函数等效的功能,但这不是大问题,因为你可以使用 goroutines 来做到 fork(2) 的大多数用法; 进程间通讯:这组功能允许在同一台 Unix 机器上运行的进程使用管道,FIFO,消息队列,信号量和共享内存等特性相互通信; 信号处理:信号为流程提供了一种处理异步事件的方法,该方法非常方便。几乎所有服务器进程都有额外的代码,这些代码使它们能够使用该组的系统调用来处理Unix信号; 网络编程:这是开发基于 TCP/IP 协议的程序。其实这部分严格来说不是系统编程。但是,大多数 TCP/IP 服务器和客户端都在处理系统资源,用户,文件和目录。因此,在大多数情况下,如果不进行某种系统编程就无法创建网络应用程序; 03 为什么写这个系列 04 参考 本系列教程主要参考如下资料: Unix 环境高级编程(第三版) System Programming with Go Go System Programming Mastering Go(Second Edition)