更懂 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)