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

December 13, 2023 · 5 min · czyt

为Mongodb安装Percona Monitoring and Management

Percona Monitoring and Management (PMM) 是一种开源数据库可观察性、监控和管理工具,可与 MySQL、PostgreSQL、MongoDB 及其运行的服务器一起使用。它使您能够在一个位置查看所有数据库的节点到单个查询的性能指标。通过查询分析,您可以快速找到成本高昂且运行缓慢的查询以解决瓶颈。此外,Percona Advisors 为您提供性能、安全性和配置建议,帮助您保持数据库保持最佳性能。备份、恢复和内置开源私有 DBaaS 等警报和管理功能旨在提高 IT 团队的工作速度。 软件安装 安装环境为Ubuntu 22.04,下面的步骤参考了Percona官网的安装文档 安装服务端 本安装需要Docker环境,如果当前机器没有安装Docker,脚本会自动进行安装 使用下面命令安装 curl -fsSL https://www.percona.com/get/pmm | /bin/bash 或者 curl -fsSL https://www.percona.com/get/pmm | /bin/bash 安装完毕以后,请稍等片刻会显示server的访问信息 Gathering/downloading required components, this may take a moment Checking docker installation - installed. Starting PMM server... Created PMM Data Volume: pmm-data Created PMM Server: pmm-server Use the following command if you ever need to update your container by hand: docker run -d -p 443:443 --volumes-from pmm-data --name pmm-server --restart always percona/pmm-server:2 PMM Server has been successfully setup on this system!...

November 18, 2023 · 2 min · czyt

系统设计101

本文使用AI自动翻译,原文仓库地址 用直观和简单的术语解释复杂的系统。 无论您是在准备系统设计面试,还是只是想了解系统在表面之下是如何工作的,我们都希望本资料库能帮助您实现这一目标。 通信协议 架构风格定义了应用程序编程接口(API)不同组件之间的交互方式。因此,它们通过提供设计和构建 API 的标准方法,确保了效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式: SOAP: 成熟、全面、基于 XML 最适合企业应用 RESTful: 流行、易于实施的 HTTP 方法 网络服务的理想选择 GraphQL: 查询语言,请求特定数据 减少网络开销,加快响应速度 gRPC: 现代化、高性能的协议缓冲器 适合微服务架构 WebSocket: 实时、双向、持久连接 非常适合低延迟数据交换 Webhook 事件驱动、HTTP 回调、异步 事件发生时通知系统 REST API 与 GraphQL 在应用程序接口设计方面,REST 和 GraphQL 各有优缺点。 下图显示了 REST 和 GraphQL 的快速比较。 REST 使用 GET、POST、PUT、DELETE 等标准 HTTP 方法进行 CRUD 操作。 当你需要在不同的服务/应用程序之间建立简单、统一的接口时,它就能很好地发挥作用。 缓存策略可以直接实施。 缺点是可能需要多次往返,从不同的端点收集相关数据。 GraphQL 为客户提供单个端点,以便准确查询所需数据。 客户端在嵌套查询中指定所需的确切字段,服务器只返回包含这些字段的优化有效载荷。 支持用于修改数据的突变和用于实时通知的订阅。 非常适合聚合多个来源的数据,并能很好地满足快速发展的前端需求。 不过,它将复杂性转移到了客户端,如果没有适当的保护措施,可能会允许滥用查询 缓存策略可能比 REST 更加复杂。 REST 和 GraphQL 之间的最佳选择取决于应用程序和开发团队的具体要求。GraphQL 非常适合复杂或频繁变化的前端需求,而 REST 则适合需要简单一致的合同的应用。...

October 24, 2023 · 11 min · czyt

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

October 5, 2023 · 4 min · czyt

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