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....

September 25, 2023 · 3 min · czyt

学习zig【译】

原文链接 https://www.openmymind.net/learning_zig/ 采用Google翻译机翻整理 安装 Zig Zig 的下载页面包括适用于常见平台的预编译二进制文件。在此页面上,您将找到最新开发版本以及主要版本的二进制文件。本指南跟踪的最新版本可以在页面顶部找到。 对于我的计算机,我将下载 zig-macos-aarch64-0.12.0-dev.161+6a5463951.tar.xz。您可能使用的是不同的平台或更新的版本。展开存档后,您应该有一个 zig 二进制文件(除了其他内容之外),您需要为其添加别名或添加到您的路径中;无论你习惯什么流程。 您现在应该能够运行 zig zen 和 zig version 来测试您的设置。 语言概述 - 第 1 部分 Zig 是一种强类型编译语言。它支持泛型,具有强大的编译时元编程功能,并且不包含垃圾收集器。许多人认为 Zig 是 C 的现代替代品。因此,该语言的语法与 C 类似。我们正在讨论以分号结尾的语句和大括号分隔的块。 Zig 代码如下所示: const std = @import("std"); // This code won't compile if `main` isn't `pub` (public) pub fn main() void { const user = User{ .power = 9001, .name = "Goku", }; std.debug.print("{s}'s power is {d}\n", .{user.name, user.power}); } pub const User = struct { power: u64, name: []const u8, }; 如果将上述内容保存为learning....

September 23, 2023 · 39 min · czyt

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....

September 22, 2023 · 7 min · czyt

一些windows定制的相关资源

脚本 移除Edge @echo off reg delete "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge" /v "NoRemove" /f >NUL 2>nul reg delete "HKLM\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\ClientState\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}" /v "experiment_control_labels" /f >NUL 2>nul reg add "HKLM\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdateDev" /v "AllowUninstall" /t REG_DWORD /d 1 /f >NUL 2>nul for /D %%I in ("%ProgramFiles(x86)%\Microsoft\Edge\Application\*") do ( if exist "%%I\Installer\setup.exe" ( echo Uninstalling Edge Chromium pushd "%%I\Installer" setup.exe --uninstall --msedge --force-uninstall --system-level --delete-profile popd ) ) msiexec /X{2BFF39DC-EFF0-355C-80CD-41D847013784} /qn /norestart set "value=MicrosoftEdgeAutoLaunch_.*" set "path=HKCU\Software\Microsoft\Windows\CurrentVersion\Run" for /f "tokens=1,*" %%A in ('reg query "%path%" /f "Microsoft" ^| findstr /R "%value%"') do ( reg delete "%path%" /v "%%A" /f ) del /q /f "%userprofile%\Desktop\Microsoft Edge....

September 20, 2023 · 1 min · czyt

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. 具有非 ....

August 31, 2023 · 2 min · czyt

如何使用C#检查网络连接

调用Windows API 在C#中可以通过Pinvoke调用windows API方式来进行网络连接的检查: [DllImport("wininet.dll", SetLastError=true)] extern static bool InternetGetConnectedState(out int lpdwFlags, int dwReserved); [Flags] enum ConnectionStates { Modem = 0x1, LAN = 0x2, Proxy = 0x4, RasInstalled = 0x10, Offline = 0x20, Configured = 0x40, } MSDN地址 https://learn.microsoft.com/en-us/windows/win32/api/wininet/nf-wininet-internetgetconnectedstate 对应的返回值Description如下: Value Meaning INTERNET_CONNECTION_CONFIGURED0x40 Local system has a valid connection to the Internet, but it might or might not be currently connected. INTERNET_CONNECTION_LAN0x02 Local system uses a local area network to connect to the Internet....

August 31, 2023 · 2 min · czyt

使用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:[email protected] 注意:DMARC记录里,有一个值可由你来自定义: p:用于告知收件方,当检测到某封邮件存在伪造发件人的情况,收件方要做出什么处理; p=none; 为收件方不作任何处理 p=quarantine; 为收件方将邮件标记为垃圾邮件 p=reject; 为收件方拒绝该邮件 rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。 ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。ruf=mailto:[email protected]; DMARC是基于DKIM和SPF的,所以开启DMARC必须先开启DKIM或SPF任意一种 消息体 Message-Id 对于Gmail等邮箱,如果你在发送邮箱的时候没有带上Message-Id也会触发退信。这时需要你在邮件发送的Header中添加Message-Id.例如<[email protected]>。可以参考微软的相关文档 邮件模板 对于常见的邮件模板,可以使用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....

August 25, 2023 · 1 min · czyt

使用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....

August 23, 2023 · 4 min · czyt

Rxgo使用备忘录

官网文档 –机器翻译内容– 介绍 ReactiveX,简称 Rx,是一个用于使用 Observable 流进行编程的 API。 RxGo 实现基于管道的概念。管道是由通道连接的一系列阶段,其中每个阶段是一组运行相同功能的 goroutine。 让我们看一个具体的例子,每个框都是一个运算符: 我们使用 Just 运算符基于固定的项目列表创建一个静态 Observable。 我们使用 Map 运算符定义一个转换函数(将圆形转换为方形)。 我们使用 Filter 运算符过滤每个黄色方块。 在此示例中,最终物品在通道中发送,可供消费者使用。使用 RxGo 消费或生成数据的方法有很多种。在频道中发布结果只是其中之一。 每个算子都是一个转换阶段。默认情况下,一切都是顺序的。然而,我们可以通过定义同一运算符的多个实例来利用现代 CPU 架构。每个运算符实例都是连接到公共通道的 goroutine。 RxGo 的理念是实现 ReactiveX 概念并利用主要的 Go 原语(通道、goroutines 等),以便两个世界之间的集成尽可能顺利。 安装 RxGo v2 go get -u github.com/reactivex/rxgo/v2 入门 你好世界 让我们创建第一个 Observable 并使用一个项目: observable := rxgo.Just("Hello, World!")() ch := observable.Observe() item := <-ch fmt.Println(item.V) Just 运算符从静态项目列表创建一个 Observable。 Of(value) 根据给定值创建一个项目。如果我们想从错误中创建一个项目,我们必须使用 Error(err) 。这与 v1 不同,v1 直接接受值或错误而无需包装它。这一改变的理由是什么?它是为了(希望)Go 2 中的泛型功能为 RxGo 做好准备。...

August 20, 2023 · 6 min · czyt

在GO中使用日志库slog

本文根据三篇文章机翻拼凑而来。其中两篇文章发布时,slog还未进入标准库。golang 1.21.0 于2023-08-09发布,slog也包含在正式库中,本文根据原文内容进行了部分的修订和补充。 什么是slog? slog 是 Go 团队的一个实验性日志记录包,提供结构化日志记录的功能。 本文向您概述了此包中的日志记录功能。 安装 # 创建一个新的 go 项目并引入 log/slog 使用记录器# 立即导入并开始使用记录器。 package main import ( "log/slog" ) func main() { slog.Info("Go is best language!") } 输出: $ go run main.go 2022/12/15 01:31:23 INFO Go is best language! 默认情况下,输出包括时间、日志级别和消息。 以下日志级别可用。 Debug Info Warn Error 结构化日志# slog 是一个结构化记录器,支持两种格式的日志记录:文本和 json。 让我们看一下文本记录器。 文本处理程序# 您首先创建一个文本处理程序和一个新的记录器。 package main import ( "os" "log/slog" ) func main() { textHandler := slog.NewTextHandler(os.Stdout,nil) logger := slog....

August 9, 2023 · 8 min · czyt