GO学习笔记 | 第五章节 用户基本功能与 Gin|GORM 入门| 跨域、中间件与 GORM 入门
GO学习笔记 | 第五章节 用户基本功能与 Gin|GORM 入门| 跨域、中间件与 GORM 入门核心内容:跨域问题(CORS)、中间件(Middleware)、GORM 增删改查、Docker Compose 启动数据库、项目分层设计前置知识:Gin 路由注册、请求绑定、参数校验 一、跨域问题(CORS) 1.1 什么是跨域? 当你用浏览器打开前端页面,前端向后端发请求时,如果前端和后端的「家」不一样,浏览器就会阻止这次请求——这就是跨域。 怎么判断是不是「同一家」? 浏览器看三个东西: 判定维度 举例:同一家 举例:不是同一家 协议 都是 http:// http:// vs https:// 域名 都是 localhost qq.com vs wechat.com 端口 都是 :3000 :3000 vs :8080 三个只要有一个不同,浏览器就认为是跨域,直接拦住。 为什么浏览器要多管闲事?防止黑客在你的网页里植入恶意脚本,偷偷往别的服务器发请求。 怎么识别跨域错误? 打开浏览器 F12 → Console,看到 CORS 或...
GO学习笔记 | Docker安装
Docker安装安装前必看:系统要求 Windows 10 21H2及以上版本 / Windows 11 所有版本 CPU至少2核4G内存,推荐8G以上内存 必须开启CPU虚拟化(下文会教怎么看) 一、第一步:开启CPU虚拟化(不开启直接报错)Docker依赖虚拟机技术,必须先确认CPU虚拟化已开启,否则安装完也启动不了: 按 Ctrl + Shift + Esc 打开任务管理器 切换到【性能】→【CPU】,看右侧是否显示虚拟化:已启用 ✅ 已启用:直接进入下一步 ❌ 已禁用:重启电脑,开机时按对应快捷键进入BIOS开启VT/虚拟化技术 不同品牌电脑进入BIOS快捷键: 品牌 快捷键 品牌 快捷键 联想(台式/笔记本) F12 / F2 惠普 F10 / Esc 戴尔 F2 华硕/微星 Del / F2 华为/荣耀 F2 其他品牌 开机看屏幕提示,一般是F2/F10/Del 进入BIOS后找到「VT-x」「Virtualization...
GO学习笔记 | 运行gorm快速入门例子时遇到的问题
运行gorm快速入门例子时遇到的问题:# runtime/cgo cc1.exe: sorry, unimplemented: 64-bit mode not compiled in这个报错非常典型,主要是因为 Go 环境是 64 位的,但电脑上配置的 C 语言编译器(GCC/MinGW)是 32 位的。 为什么会报这个错? # runtime/cgo:说明你当前运行的程序用到了 Go 调用 C 语言代码的机制(CGO)。 cc1.exe:这是 GCC 编译器的核心程序。 sorry, unimplemented: 64-bit mode not compiled in:你电脑上的这个 cc1.exe 是被编译成 32 位的。当 64 位的 Go 程序要求它编译 64 位的代码时,它直接报错罢工,说“我没这功能”。 推荐做法(一劳永逸): 去 GitHub 下载 MinGW-w64 的在线安装包,或者直接下载 x86_64 版本的 TDM-GCC(切记一定要选 x86_64 或 64-bit 版本)。 安装完成后,找到 bin 目录(里面应该有...
GO学习笔记 | 刷leetcode中常用的go基础语法点
刷leetcode中常用的go基础语法点 基础声明123456789101112131415// 局部变量x := 0s := []int{1, 2, 3}m := map[int]string{1: "a"}// 空 slice / map(之后用 append 填)s := make([]int, 0) // nil slice 也能 append,但 make 意图更明确s := make([]int, 0, 10) // 预分配容量,知道大概长度时更高效m := make(map[int]string)// 二维 slicedp := make([][]int, n)for i := range dp { dp[i] = make([]int, m)} Slice 操作(每日必用)123456789101112131415161718192021222324// 追加s = append(s, x)// 末尾删除(模拟 pop)s = s[:len(s)-1]//...
GO学习笔记 | GO面试要点笔记(持续更新)
GO面试要点笔记(持续更新)第一周 1.问题回答1. 什么是闭包?闭包有什么缺陷? 什么是闭包:闭包是指一个函数(在 Go 中通常指匿名函数)引用了其外部作用域中的变量。即使该外部函数已经返回,这个匿名函数依然可以访问并修改这些外部变量。 缺陷(注意事项): 内存泄漏:如果闭包长期存活(例如作为全局变量或长期运行的协程),其捕获的外部变量将一直无法被 GC 回收,导致内存占用过高。 共享变量副作用:在循环中使用闭包非常容易出错。例如 for i:=0; i<10; i++ { go func() { println(i) }() } 会打印多个 10,因为所有闭包共享了同一个变量 i。 性能开销:闭包本质上是通过指针访问外部变量,底层涉及逃逸分析,有一定的性能开销。 2. 什么情况下会出现栈溢出? 无限递归:函数直接或间接地无限调用自身,导致调用栈无限堆积。 分配过大的局部变量:在函数内部声明了非常大且不能逃逸到堆上的数组或结构体,导致单个栈帧过大。 Go 特定情况:Go 的协程(Goroutine)初始栈很小(约...
GO学习笔记 | 安装和配置gorm过程中遇到的问题
安装和配置gorm过程中遇到的问题安装12go get -u gorm.io/gormgo get -u gorm.io/driver/sqlite 快速入门泛型 API (>= v1.30.0)12345678910111213141516171819202122232425262728293031323334353637383940package mainimport ( "context" "gorm.io/driver/sqlite" "gorm.io/gorm")type Product struct { gorm.Model Code string Price uint}func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { ...
GO学习笔记 | 第四讲注册功能相关内容复盘
GO学习笔记 | 第四讲注册功能相关内容复盘1. Engine vs ContextEngine:gin.Default() 返回一个 *gin.Engine,它是整个 HTTP 服务器的抽象。一个 Engine = 一个逻辑服务器,绑定一个端口。可以启动多个 Engine 监听不同端口(比如 :8080 给用户,:8081 给后台管理)。 Context:*gin.Context 代表一次请求。每个 HTTP 请求到达时,Gin 创建一个 Context,把 Request(输入)和 Writer(输出)都包进去,然后传给路由处理函数。请求结束,Context 销毁。 一句话:Engine 是长生命周期(进程级),Context 是短生命周期(一次请求)。 2. 参数路由 vs 通配路由1234567891011// 参数路由:匹配路径中的一段server.GET("/users/:name", handler)// /users/zhangsan → 匹配,ctx.Param("name") =...
GO学习笔记 | CORS 跨域问题笔记
CORS 跨域问题笔记问题描述前端(localhost:3000)调用后端(localhost:8080)接口时,浏览器控制台报错: 1234Access to XMLHttpRequest at 'http://localhost:8080/users/signup' from origin'http://localhost:3000' has been blocked by CORS policy: Response to preflightrequest doesn't pass access control check: No 'Access-Control-Allow-Origin'header is present on the requested resource. Axios 返回 Network Error,请求被浏览器拦截。 原因浏览器同源策略:端口不同即为跨域。POST 请求会先发 OPTIONS 预检,后端未返回 CORS 头导致拦截。 注:Postman...
GO学习笔记 | Gin快速安装与入门
Gin快速安装与入门前置条件 Go 版本:Gin 需要 Go 1.25 或更高版本 确认 Go 在你的 PATH 中并且可以从终端使用。有关 Go 安装帮助,请参阅官方文档。 第一步:安装 Gin 并初始化项目首先创建一个新的项目文件夹并初始化 Go 模块: window123mkdir gin-quickstart && cd gin-quickstartgo mod init gin-quickstart 添加 Gin 作为依赖: window1go get -u github.com/gin-gonic/gin 第二步:创建你的第一个 Gin 应用创建一个名为 main.go 的文件: window1touch main.go 打开 main.go 并添加以下代码: 12345678910111213package mainimport "github.com/gin-gonic/gin"func main() { router := gin.Default() ...
LeetCode Hot100 | Day8 | 两数之和
LeetCode Hot100 | Day8 | 两数之和1.两数之和1. 两数之和 - 力扣(LeetCode) 还是老套路,哈希表里面存储nums[i]和下标i,然后去检查如果nums[i]作为第一个数字可行与否,也就是判断target-nums[i]的值在不在数组中,如果可行的话直接返回,如果不行的话就插入当前的nums[i]和其下标 CPP版本 1234567891011121314class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> s; for(int i=0;i<nums.size();i++) { if(s.find(target-nums[i])!=s.end()) return...









