go 怎么学

Note 突发奇想,想做一个镜像站,不想用 Java,觉得 go 可以试试,问问 gpt 速学 go可不可能。让他给我安排 28 天的计划如下。后续开启 go-learn 进行学习 🗓 Go 学习每日任务清单(28 天 × 每天 2 小时) 阶段 1:Go 基础与并发模型(Day 1–7) 🧠 目标:掌握 Go 核心语法 + 并发思想 天数 主题 任务与练习 Day 1 Go 环境与项目结构 - 安装 Go- 运行 go mod init demo- 了解 go run, go build, go fmt, go test- 写出第一个 “Hello, Go!” Day 2 基础语法与函数 - 学习变量声明、常量、函数、多返回值、error- 练习:写一个简单计算器函数- 理解 defer、panic、recover Day 3 Struct 与方法 - 定义一个 User 结构体并实现 Hello() 方法- 使用指针接收者 vs 值接收者- 熟悉 JSON 序列化 (encoding/json) Day 4 Slice / Map / Range / 指针 - 练习创建与遍历 Slice 与 Map- 理解 make 与 new- 写一个词频统计器(word counter) Day 5 并发基础:goroutine + channel - 启动多个 goroutine 打印任务编号- 使用 channel 汇总结果- 写一个并发 worker pool Day 6 同步机制:sync + context - 使用 sync.WaitGroup 控制 goroutine 结束- 写一个带超时的 context 任务- 理解 select 与 channel 超时 Day 7 小项目复盘:并发爬虫 - 实现:并发请求一组 URL,输出状态码与耗时- 使用 goroutine + WaitGroup + channel 汇总结果 阶段 2:Web 服务与数据库实战(Day 8–14) 🧠 目标:掌握 Gin + GORM + JWT + Viper 的使用 天数 主题 任务与练习 Day 8 Gin 入门 - 安装 Gin- 编写基础路由 /ping, /hello/:name- 使用 POST 接收 JSON Day 9 中间件与统一响应 - 编写 Logging Middleware- 返回标准格式:{"code":0,"msg":"ok","data":{}}- 全局异常恢复 Day 10 GORM ORM 基础 - 初始化数据库连接(SQLite 或 PostgreSQL)- 定义 User 模型并自动建表- 实现基础 CRUD Day 11 配置管理:Viper - 使用 viper 读取 .env / config.yaml- 设置多环境配置(dev/prod) Day 12 用户注册 + 登录 + JWT - 安装 github.com/golang-jwt/jwt/v5- 编写 /register /login- JWT 中间件鉴权 Day 13 日志系统 - 使用 zap 替换 fmt.Println- 日志包含 traceID / request path- 按天滚动日志文件 Day 14 阶段项目复盘 项目:UserService- 注册 / 登录 / 获取用户信息- 使用 Gin + GORM + JWT + Zap 组合完成 Demo 阶段 3:多租户架构与上下文传递(Day 15–21) 🧠 目标:理解租户隔离 + 实现租户中间件 天数 主题 任务与练习 Day 15 多租户概念与三种模型 - 理解 DB 级 / Schema 级 / Row 级(tenant_id)隔离差异- 选择你项目的隔离策略(建议 Row 级) Day 16 模型扩展 tenant_id - 修改所有表结构添加 tenant_id 字段- 写 GORM hook:自动注入 tenant_id Day 17 请求上下文传递 - Middleware 读取 Header 中的 X-Tenant-ID- 注入到 context.Context 并传入 GORM Day 18 多数据源支持 - 设计 map[string]*gorm.DB 缓存连接池- 允许按租户动态切换数据源 Day 19 路由分组与租户验证 - 添加租户中间件:验证租户合法性- 限制跨租户访问 Day 20 RBAC 权限控制 - 表设计:tenant, user, role, user_role- 定义角色枚举(ADMIN / USER)- 编写权限检查中间件 Day 21 阶段项目复盘 项目:TenantHub- 多租户用户系统- Header 传递租户- 每租户独立用户空间 阶段 4:工程化、测试与部署(Day 22–28) 🧠 目标:形成可部署的生产级项目骨架 天数 主题 任务与练习 Day 22 项目结构重构 - 使用 Clean Architecture- 拆分目录:cmd/, internal/, pkg/- 抽象 service/dao/controller Day 23 单元测试与 Mock - 使用 testing + testify/assert- 对 service 层编写测试- 模拟数据库操作 Day 24 CLI 工具开发 - 创建 cmd/migrate/main.go- 支持命令:create-tenant, migrate Day 25 Docker 化部署 - 编写多阶段 Dockerfile- 使用 docker-compose 启动 Postgres + API 服务 Day 26 性能与并发优化 - 使用 go test -bench . 做基准测试- 优化 goroutine 复用、连接池大小 Day 27 CI/CD 与版本管理 - 用 Makefile 或 GitHub Actions 构建发布包- 输出二进制 ./bin/mthub Day 28 项目总结与发布 - 写 README- 总结架构与经验- 打包上传到私有镜像仓库(可选) 🧱 最终成果(Day 28 完成后) 你将拥有: ...

December 16, 2025 · 3 min · 532 words · Ray

新服务器初始化 2

Note 又剁手搞了台小鸡,重温一下服务器初始化 参考文章 Linux服务器的初步配置流程 - 阮一峰的网络日志 之前我写的 博客服务器初始化 | 安落滢 Blog但是写的比较简单,这次稍微整理一下格式和一些细节,并且加上一些安全配置 那么文章是老文章了,所以新的流程会有一丢丢变化,可以偷一些懒 📌 前提 本文假设你已经: 安装好最新的 Ubuntu Server LTS(例如 Ubuntu 24.04 LTS 或 22.04 LTS)系统;参考官方安装流程可以先完成基本安装和网络配置。 有 root 或 sudo 权限来执行系统初始化操作。 步骤 内容 登录 & 用户 创建普通用户、禁用 root SSH 系统更新 更新升级及自动安全升级 安全配置 SSH 强化、UFW、Fail2Ban 系统增强 Chrony、Audit、安全扫描 其他 时区、Swap、常用工具 🚀 一、首次登录 & 用户账号设定 1. 登录服务器 1 ssh root@your_server_ip 如果是云主机一般默认创建了一个 sudo 用户,可以直接用该用户登录,而不要直接用 root 登录。 ...

December 15, 2025 · 2 min · 317 words · Ray

什么是浏览器指纹:10 分钟彻底了解 16 个指纹

什么是浏览器指纹:10 分钟彻底了解 16 个指纹 作者:AdsPower — 2024-04-29 整理者:gpt5.1 Note 虽说摘自他山,但是这是开启什么系列以来第一个合适的命题,干脆直接塞进分类充数。跑起来最重要。 简介 当你访问网站(例如社交网站 / 电商网站)时,网站可能会悄悄收集你浏览器 / 设备的各种细节 —— 比如 IP、所用操作系统、屏幕分辨率、安装字体等。 这些看似无关紧要的信息组合在一起,就可能构成一个“浏览器指纹”(browser fingerprint),使网站能够识别你为一个独特访问者 —— 即使你清除 Cookies 或启用了“隐私模式”。 理解常见的浏览器指纹项,有助于: 理解网站为何/如何“识别”你; 在使用“指纹浏览器”或“反指纹/虚拟环境”时,更理性地设计你的环境配置; 提高多个账号并行运营时(例如电商、社媒、营销等)的安全性与隐蔽性。 为什么网站要收集浏览器指纹 浏览器指纹可以让网站“记住你是谁”。即便你清除 Cookies,网站也可能通过指纹判断“你回来过”。 对于电商网站 / 社交平台,识别用户是否“真实”、是否“同人 操作多个账号”很重要,指纹就是一个重要依据。 对于需要管理多个账号(例如营销、社媒运营、电商多店铺等)的用户/团队,了解、控制指纹可以帮助减少账号关联、降低被封禁/风控的风险。 常见的 16 种浏览器指纹及其含义 以下是文章列出的 16 项指纹(fingerprint)及其作用/特性: # 指纹类型 含义 / 来源 / 作用 1 IP 地址 用于识别用户设备的网络地址,是最基础的识别方式。 2 地理位置 通过 IP 推断出用户所在国家 / 地区 /城市甚至经纬度/邮政编码等。 3 时区与当地时间 基于地理位置或系统设置,可以反映用户的“真实”或“伪装”时区信息;如果与 IP 的地理位置不一致,则可能被检测为异常。 4 User Agent(UA) 表示浏览器类型、版本、操作系统等信息,是常见且重要的指纹组成。 5 浏览器语言 浏览器设置的首选语言 (Accept-Language) 。不同语言设置也可能被用作识别。 6 字体 (Fonts) 设备安装的字体集合 — 不同用户可能安装不同字体,通过字体列表也能区分用户。 7 屏幕分辨率 包括显示器分辨率以及浏览器窗口的可视区域大小,不同显示设备和窗口设置会不同。 8 WebGL / WebGPU 通过图形 API 获取设备 GPU / 显示能力相关信息,作为硬件相关指纹的一部分。 9 媒体设备指纹 (Media Devices) 通过浏览器对音频 / 视频设备 (如麦克风、摄像头) 的检测获取硬件信息 (设备类型、标签、分辨率等)。 10 AudioContext 浏览器处理音频的能力 /特性 — 也可能因设备 /软件设置不同而不同,可用于区分用户。 11 ClientRects 浏览器在渲染网页时,对页面元素的位置、布局进行计算 — 这些布局信息(受设备/窗口/浏览器微差异影响)也可能差异显著。 12 SpeechVoices 浏览器/系统提供的语音合成 (Text-to-Speech) 选项 (语音种类、语言、性别等) — 设备不同可能有不同选项,也可作为指纹。 13 硬件并发数 (hardwareConcurrency) 表示设备处理器的逻辑核心数 (CPU 线程数),通过 navigator.hardwareConcurrency 获取 — 不同设备可能不同。 14 设备内存 (deviceMemory) 设备可用内存 (RAM) 大小 (通过 navigator.deviceMemory 获取) — 虽然该值有限制 (通常返回 2/4/6/8 之一),但仍可能被用于区分。 15 Do Not Track (DNT) 浏览器隐私设置中的 “不追踪” 标志 — 如果用户开启了 DNT,该设置也可能成为唯一性特征。 16 Canvas 指纹 (Canvas Fingerprint) 通过让浏览器在一个 <canvas> 上绘制图形/文本,然后分析其渲染结果 (轮廓/像素/抗锯齿等细节) — 因为每台设备 (硬件 + 字体 + 显卡) 不同,渲染结果可能略有不同,从而形成独特“指纹”。 使用“指纹浏览器 / 虚拟环境”保护账户安全 如果你在运营多个账号 — 比如社交媒体账号、电商店铺账号、营销账号等 — 想避免因“相同设备/环境指纹”被关联或封禁,可以考虑使用“指纹浏览器 / 虚拟浏览器环境”。例如 AdsPower 就是这样一种工具,它允许你为每个账号创建独立的浏览器环境,并对上述多个指纹项目进行自定义/模拟。 ...

December 10, 2025 · 2 min · 242 words · Ray

lambda 引发的编程语言陈年知识回顾

偷听会议室老板拷打同事知道什么是 lambda 吗?同时我正在看一篇关于使用aws mqtt的文章,里面提到了aws lambda。我一想,lambda 不就是匿名函数吗,然后呢,似乎我并不了解他,就好像我看到一只鸟,我知道他叫布谷鸟,也许我知道他还叫大杜鹃(实际不知道,我刚刚搜的),英文名叫Cuculus canorus,但是我依旧不了解他( 费曼父亲的教导),那么我深深反思,我不知道什么是 lambda,我现在需要知道一下。 所以在这过程里,我问了一些问题,什么是 lambda、什么是 Lisp、什么是一等公民、什么是闭包、python 的 map 是啥 什么是Lambda 我有一种中国学生的特性,写东西模糊有一种框架 1. 定义 2. 内容 3. 意义 4. 展望。 感觉这很蠢,但我暂时没有更棒的方式,当然这种文章不会有展望 这个就读 Lambda λ ,希腊字母表第 11 个字母 Lambda - Wikipedia 为什么匿名函数叫 Lambda Anonymous function - Wikipedia Anonymous functions originate in the work of Alonzo Church in his invention of the lambda calculus, in which all functions are anonymous, in 1936, before electronic computers.[2] In several programming languages, anonymous functions are introduced using the keyword lambda, and anonymous functions are often referred to as lambdas or lambda abstractions. Anonymous functions have been a feature of programming languages since Lisp in 1958, and a growing number of modern programming languages support anonymous functions. ...

December 5, 2025 · 2 min · 426 words · Ray

凌晨总是那么美妙,那种静谧。

凌晨总是那么美妙,那种静谧。 一个人洗完澡,喝杯水,身上保持干爽,头脑略微犯困却又不至于昏昏沉沉,反而是更加灵敏的时候,看点书在这个时候最棒最棒了,有一种独坐在宇宙中心尽情汲取能量的感觉。 今晚看了一点点故园风雨后,翻开过三四次,每次五六页,还不足以启动这趟新的旅程,就像推动静止物体所需的力,大于物体在运动过程中推动他的力一样,需要一段启动的过程。 书讲什么的,没仔细看,只是看评价不错,尺寸小小的,深得我意。开篇描述战争期间军士官的自述,我虽然选择过学历史,可是我不爱记也不爱特意了解,读的书也少,肚子里没啥货,所以我也不知道背景是什么战争,有提到希特勒,那就是二战了,我不特意了解太多背景,像是预习或者调研,有时候看书爱保留一些朦胧感。看书时像品红酒一样,其实不必要知道太多背景,那是他的title or tag,可以先来一口,闻一闻,抿一抿,酒总是刺痛滚进喉咙,除了米酒会给点甜头,酒并不好喝的,大人爱喝,大概我还小,今晚在对象家和她家人喝了几杯,我酒量还好,预估是一斤白酒的感觉,不过伤身伤脑,还是少喝为妙,能偷就偷一点。 书有满满的译制腔味,脑海总是浮现出那类声音 哦我的上帝,实在是不早了,早点休息吧,明天还要上班呢! 晚安😴

December 2, 2025 · 1 min · 9 words · Ray