-
使用net/http实现RESTAPI,通过路由分发请求至控制器处理。1.定义User模型用于JSON序列化;2.在controllers中实现GetUsers和GetUserByID处理函数,返回内存用户数据;3.routes/router.go注册路径路由;4.main.go启动服务并监听8080端口。访问/users可获取用户列表。后续可引入mux路由、中间件、数据库等增强功能。
-
Fiber默认StrictRouting导致/user与/users/被视为不同路由而404;Next()是否继续执行取决于是否已写响应;fiber.Default()自动挂载Logger等中间件而New()为空;QueryParam读querystring,Params读路由参数。
-
用reflect.TypeOf提取函数签名最直接:需传函数变量(如reflect.TypeOf(myFunc))而非调用结果,再通过NumIn/NumOut获取参数和返回值数量,用In(i)/Out(i)获取具体类型,注意receiver处理、Kind()判断基础类型及缓存优化。
-
main.go应放在模块根目录或cmd/{name}/下,必须属main包;go.mod必须在模块根目录以正确定义import路径;测试文件需与源码同目录同包名且以_test.go结尾。
-
Go程序操作KubernetesDeployment需确保:1.ObjectMeta.Name/Namespace非空;2.Spec.Replicas为非nil指针;3.Spec.Selector与Spec.Template.Labels完全匹配;4.更新时仅修改可变字段,避免触碰immutable字段。
-
Go中表达式求值后必有结果,语句无值;if/for/switch/return是语句,不能用于赋值等需值的上下文,而a+b、len(s)等是表达式,可赋值或传参。
-
用unsafe.Sizeof和unsafe.Offsetof可精确验证结构体内存布局:Sizeof返回总大小,Offsetof获取字段偏移,差值即填充字节;需按对齐规则分组重排字段,兼顾序列化契约与缓存行对齐。
-
在Go语言中,编译器严格禁止声明但未使用的变量。当调用如stmt.Exec()这类返回多个值的函数却只关心错误时,应使用空白标识符_显式忽略无关返回值,既满足语法要求,又保持代码清晰。
-
devcontainer.json中必须指定image或Dockerfile二者之一;推荐优先使用官方devcontainers/go镜像,它已预装go、gopls、delve等工具;若需自定义则用Dockerfile,并注意路径、端口转发、GOPROXY等配置。
-
replace语句必须写在项目根目录的go.mod文件中,位于require块之后、exclude或retract之前;右边路径须为以./开头的相对路径,且对应目录下必须有合法go.mod文件。
-
for{}会占满CPU是因为它不包含任何让出CPU的操作,导致goroutine持续抢占时间片;加time.Sleep(1ms)可有效降低占用至0.5%以下,而time.Sleep(0)无效。
-
WaitGroup值传递导致Done()无效:必须用指针传递;deferwg.Done()应置于函数首行;无缓冲channel需提前启动接收goroutine;Add()与Done()必须一一对应。
-
errors.As用于安全向下断言error接口为具体错误类型并提取底层值,需传入指针的指针,适用于按类型分支处理而非仅用Error()获取字符串。
-
Go语言不能直接创建Vue项目,因其缺乏Node.js生态支持;正确做法是用VueCLI初始化前端,再由Go托管构建后的静态资源或通过反向代理联调。
-
Redis分布式锁易误判超时是因为SET成功后业务执行超时导致锁提前过期,需用唯一value校验+原子续期;ZK锁需监听前序节点防羊群效应,sessiontimeout须大于业务超时;解锁必须用Lua脚本而非DEL。