使用uber cff进行并发编程

第一个项目 配置相关工具 先决条件 Go 1.18 或更新版本 带有 go.mod 文件的项目 大多数go项目应采取以下步骤建立 cff。 如果项目目录中还没有 “tools.go”,请在其中创建一个。您将在此指定开发时的依赖关系。 cat > tools.go <<EOF //go:build tools package tools // use your project's package name here EOF 确保使用与项目目录相同的软件包名称。 将 import _ "go.uber.org/cff/cmd/cff" 添加到 tools.go 中。 echo 'import _ "go.uber.org/cff/cmd/cff"' >> tools.go 运行 go mod tidy 获取最新版本的 cff,或运行 go get go.uber.org/cff@main 获取当前未发布的分支。 go mod tidy 将 cff CLI 安装到项目的 bin/ 子目录下。 GOBIN=$(pwd)/bin go install go.uber.org/cff/cmd/cff 请随意 gitignore 此目录。 echo '/bin' >> ....

使用uber-go的fx进行依赖注入

入门 下面是一个官方的例子: package main import ( "context" "fmt" "go.uber.org/fx" "io" "net" "net/http" "os" ) func main() { fx.New( fx.Provide( NewHTTPServer, NewEchoHandler, NewServeMux, ), fx.Invoke(func(srv *http.Server) {}), ).Run() } func NewHTTPServer(lc fx.Lifecycle, mux *http.ServeMux) *http.Server { srv := &http.Server{ Addr: ":8080", Handler: mux, } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { ln, err := net.Listen("tcp", srv.Addr) if err != nil { return err } fmt.Println("Starting HTTP server at", srv.Addr) go srv.Serve(ln) return nil }, OnStop: func(ctx context....

Golang测试参考  [draft]

常规测试 性能测试 单元测试 模糊测试 原生测试包 httptest iotest 故障测试 failpoints Failpoints 是一种在代码中注入错误或其他行为的工具,主要用于测试。当Failpoints被配置为激活状态时,对应的代码片段才会被执行。它可以模拟各种复杂系统中的错误处理,以提高它们的容错性和稳定性。 例如,你可以在开发和调试应用程序时使用 Failpoints 使程序在特定时刻进行错误处理或表现出异常行为。最常见的使用场景是模拟网络延迟、磁盘损坏等异常情况,以测试应用程序对这些异常的处理能力。 Failpoints 也可以用于优化代码。在一些情况下,当有多个 guard 语句时,Failpoints 可以将这些不必要的代码提供给全部内联,使代码更符合 DRY(Don’t Repeat Yourself) 原则。 相关链接: Pingcap/failpoint etcd-io/gofail Mock测试 GoMock gomock是官方的mock生成工具,能够很好地和go test 框架集成。mock代码的生成基于mockgen。 安装mockgen Go 版本< 1.16 GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0 Go版本 1.16+ go install github.com/golang/mock/mockgen@latest 使用 GoMock支持两种Mock模式:源码模式和反射模式。完整的参数列表说明如下: 若给定一个 Go 源文件,其中包含要被模拟的接口,则使用 modgen 命令为模拟类生成源代码。它支持以下参数: source: 包含要模拟的接口的文件。 destination: 一个文件,用于编写源代码。如果不设置此选项,代码将打印到标准输出。 package: 用于生成模拟类源代码的包。如果您没有设置它,那么包的名称就是 mock _ concatedwith 输入文件的包。 import: 应该在生成的源代码中使用的显式导入列表,指定为以逗号分隔的 foo = bar/baz 格式的元素列表,其中 bar/baz 是被导入的包,foo 是生成的源代码中用于包的标识符。...

Golang命令行库bubbletea使用备忘  [draft]

核心概念 Model model是bubbletea的核心接口,定义如下: type Model interface { Init() Cmd Update(msg Msg) (Model, Cmd) View() string } Command 参考资料 Rapidly building interactive CLIs in Go with Bubbletea Intro to Bubble Tea in Go Processing user input in Bubble Tea with a menu component

12 个改变我生产力的个人go技巧【译】

原文链接https://dev.to/func25/12-personal-go-tricks-that-transformed-my-productivity-mne 作者 我通常在 Devtrovert 分享有关系统设计和 Go 的见解。请随时查看我的 LinkedIn Phuong Le 以获取最新帖子。 在从事生产项目时,我注意到我经常重复代码并利用某些技术,直到后来回顾我的工作时才意识到这一点。 为了解决这个问题,我开发了一个解决方案,事实证明它对我很有帮助,而且我认为它对其他人也可能有用。 下面是从我的实用程序库中随机挑选的一些有用且通用的代码片段,没有任何特定的分类或特定于系统的技巧。 1.跟踪使用时间的技巧 如果您有兴趣跟踪 Go 中函数的执行时间,您可以使用一个简单而有效的技巧,只需使用“defer”关键字的一行代码即可。您所需要的只是一个 TrackTime 函数: // Utility func TrackTime(pre time.Time) time.Duration { elapsed := time.Since(pre) fmt.Println("elapsed:", elapsed) return elapsed } func TestTrackTime(t *testing.T) { defer TrackTime(time.Now()) // <--- THIS time.Sleep(500 * time.Millisecond) } // elapsed: 501.11125ms 1.5.两阶段延迟 Go 延迟的强大之处不仅在于任务完成后的清理工作,还在于任务完成后的清理工作。这也是为了做好准备,请考虑以下事项: func setupTeardown() func() { fmt.Println("Run initialization") return func() { fmt.Println("Run cleanup") } } func main() { defer setupTeardown()() // <-------- fmt....

go泛型备忘录【译】

原文 https://gosamples.dev/generics-cheatsheet/ 入门 泛型发布 Go 中的泛型自 2022 年 3 月 15 日发布的 1.18 版本起可用。 泛型函数 使用泛型,您可以创建以类型作为参数的函数。而不是为每种类型编写单独的函数,例如: func LastInt(s []int) int { return s[len(s)-1] } func LastString(s []string) string { return s[len(s)-1] } // etc. 您可以编写带有类型参数的函数: func Last[T any](s []T) T { return s[len(s)-1] } 类型参数在方括号中声明。它们描述了给定函数允许的类型: 泛型函数调用 您可以像调用任何其他函数一样调用通用函数: func main() { data := []int{1, 2, 3} fmt.Println(Last(data)) data2 := []string{"a", "b", "c"} fmt.Println(Last(data2)) } 您不必像下面的示例那样显式声明类型参数,因为它是根据传递的参数推断的。此功能称为类型推断,仅适用于函数。 func main() { data := []int{1, 2, 3} fmt....

Go 中的 Redis 缓存:初学者指南【译】

原文链接:https://betterstack.com/community/guides/scaling-go/redis-caching-golang/ 使用Google机翻 Redis 是一种通用的内存数据存储,通常用于缓存、会话管理、发布/订阅等。它的灵活性和广泛的用例使其成为个人和商业项目的热门选择。 本文将提供关于使用 Redis 作为 Go 程序缓存的可访问介绍,探索其最流行的应用程序。您将学习如何在 Go 应用程序中连接到 Redis 服务器并执行基本的数据库操作,利用其功能来提高性能并减少数据库负载。 让我们开始吧! 先决条件 要按照本文进行操作,请确保您的计算机上安装了最新版本的 Go。如果您缺少 Go,可以在此处找到安装说明。 步骤 1 — 安装和配置 Redis 请按照此处的说明为您的操作系统安装最新的 Redis 稳定版本(撰写本文时为 v7.x)。 redis-server --version 输出 Redis server v=7.0.12 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=d706905cc5f560c1 安装后,通过执行以下命令确认 Redis 正在运行: sudo systemctl status redis 输出 ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2023-08-09 08:23:32 UTC; 5min ago Docs: http://redis....

Golang编译进阶【译】

本文翻译自 https://dev.to/jacktt/go-build-in-advance-4o8n I/构建选项 以下是 go build 命令最常用的一些选项: -o :指定输出文件名。默认输出文件名是主包的名称,Windows 上添加 .exe 后缀。 -v :详细输出。此选项在编译包时打印包的名称。 -work :打印临时工作目录的名称,退出时不删除。该选项对于调试很有用。 -x :打印命令。此选项打印 go build 命令正在执行的命令。 -asmflags :传递给 go tool asm 调用的参数。 -buildmode :要使用的构建模式。默认构建模式是 exe 。其他可能的值有 shared 、 pie 和 plugin 。 -buildvcs :是否使用版本控制信息标记二进制文件。默认值为 auto 。 有关 go build 命令的更多信息,您可以运行以下命令: go help build II/ 将包含哪些文件 当您在 Go 中使用 go build 命令时,它会编译当前目录及其子目录中的 Go 源文件以创建可执行二进制文件。默认情况下,Go 只编译 .go 文件,忽略目录中的其他类型的文件。然而,值得注意的是 go build 命令的行为可能会受到构建标签、构建约束的影响。 go build 通常会忽略以下类型的文件: 1. 具有非 ....

使用go发送邮件的注意事项

服务器设置 SPF设置 如果你使用的是企业邮箱,可能需要添加SPF记录。SPF(Sender Policy Framework) 是电子邮件系统中发送方策略框架的缩写,它的内容写在DNS的txt类型的记录里面;作用是防止别人伪造你的邮件地址进行发信,是一种非常高效的反垃圾邮件解决方案。如果你的服务器没有设置邮件的SPF,那么在发送邮件到Gmail等邮箱地址时,会发生退信。 一般给域名添加SPF记录的方式是添加一条TXT记录。以腾讯企业邮箱为例,添加的TXT记录值是v=spf1 include:spf.mail.qq.com -all 使用go可以实现查询域名的TXT信息。 func TestNetLookupTxt(t *testing.T) { txt, err := net.LookupTXT("czyt.tech") if err != nil { t.Fatal(err) } t.Log(txt) } DKIM 腾讯企业邮箱 DKIM配置说明 DMARC DMARC(Domain-based Message Authentication, Reporting & Conformance)是一种基于现有的SPF和DKIM协议的可扩展电子邮件认证协议,邮件收发双方建立了邮件反馈机制,便于邮件发送方和邮件接收方共同对域名的管理进行完善和监督。对于未通过前述检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。从而有效识别并拦截欺诈邮件和钓鱼邮件,保障用户个人信息安全。这里同样以腾讯企业邮箱为例。在DNS管理的地方添加以下DMARC记录: 主机记录: _dmarc 记录类型:TXT 记录值: v=DMARC1; p=none; rua=mailto:mailauth-reports@qq.com 注意:DMARC记录里,有一个值可由你来自定义: p:用于告知收件方,当检测到某封邮件存在伪造发件人的情况,收件方要做出什么处理; p=none; 为收件方不作任何处理 p=quarantine; 为收件方将邮件标记为垃圾邮件 p=reject; 为收件方拒绝该邮件 rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。 ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。ruf=mailto:xxx@xxxxxx.com; DMARC是基于DKIM和SPF的,所以开启DMARC必须先开启DKIM或SPF任意一种 消息体 Message-Id 对于Gmail等邮箱,如果你在发送邮箱的时候没有带上Message-Id也会触发退信。这时需要你在邮件发送的Header中添加Message-Id.例如<4867a3d78a50438bad95c0f6d072fca5@mailbox01.contoso.com>。可以参考微软的相关文档 邮件模板 对于常见的邮件模板,可以使用Hermes这个Golang库。下面是一个例子: package main import ( "github.com/matcornic/hermes/v2" ) type inviteCode struct { } func (w *inviteCode) Name() string { return "invite_code" } func (w *inviteCode) Email() hermes....

使用Hashcorp的cleanhttp

缘起 早上在某地方看到这样一张图 大意是说任何第三方库都可以拦截您的所有 HTTP 调用,然后推荐了一个库 cleanhttp 官网的介绍: Functions for accessing “clean” Go http.Client values 用于访问“干净”Go http.Client 值的函数 The Go standard library contains a default http.Client called http.DefaultClient. It is a common idiom in Go code to start with http.DefaultClient and tweak it as necessary, and in fact, this is encouraged; from the http package documentation: Go 标准库包含一个名为 http.DefaultClient 的默认 http.Client 。在 Go 代码中,以 http.DefaultClient 开头并根据需要进行调整是一种常见的习惯用法,事实上,这是值得鼓励的;来自 http 包文档: The Client’s Transport typically has internal state (cached TCP connections), so Clients should be reused instead of created as needed....