Go 语言,你需要了解的一些规则

下面这些是 Go 语言本身的规则(编译器/运行时强制,或官方强烈约定)。

1. 包与可见性(你已经知道)

  • 一个目录 = 一个包,包名通常等于目录名。
  • 首字母大写导出,小写仅本包。
  • package main + func main() 才是可执行入口。
  • 只能 import 别的包,不能 import 单个文件;同包文件互相可见、不用 import。

2. 编译与依赖

  • 模块以 go.mod 的 module 名为 import 前缀(本仓库是 audit-review)。
  • 循环 import 禁止:A import B、B 再 import A 会编译失败。
  • 未使用的 import、未使用的局部变量是 编译错误 (_ 可丢掉不想用的值)。
  • 没有隐式类型转换:int32 和 int64 必须显式转。

3. 零值与指针

  • 变量声明后就是零值:0、""、nil、false,没有「未初始化」的垃圾值。
  • nil 指针解引用会 panic。
  • new(T) / &T{} 得到 *T;方法接收者常用指针,避免拷贝、允许修改。

4. 错误处理

  • 没有异常体系当主路径;约定返回 (result, error)。
  • error == nil 才算成功;忽略 error 是合法语法,但是坏习惯。
  • panic 只用于真正不可恢复(配置都扫不进来);recover 一般只在框架中间件里。

5. 控制流

  • if err != nil { return ..., err } 是常态,没有 try/catch。
  • defer:函数返回前执行(关文件、Cleanup()),后写的 defer 先执行。
  • for 是唯一循环;range 遍历切片/map/channel。
  • switch 不用写 break,默认不会落到下一分支(和 C 不同)。

6. 接口

  • 接口是 隐式实现 :有方法就算实现,不用写 implements。
  • 小接口更常见(error 就一个 Error() string)。
  • 接口变量底层是「类型 + 值」;值为 nil 但带着类型时,== nil 可能是 false(踩坑点)。

7. 切片、map、append

  • 切片是对底层数组的视图:len / cap。
  • append 可能换新数组,必须接住返回值。
  • map 零值是 nil,读可以、写之前要 make。
  • map 遍历顺序每次不一定相同。

8. 并发

  • go f() 开 goroutine,和线程不是 1:1。
  • channel 用来通信;向已关闭的 channel 发送会 panic。
  • 没有内置的「共享内存加锁就安全」保证,数据竞争要自己避免(sync.Mutex 或不要共享)。
  • init.go 里那种 go uc.createKnowledgeWithRetry 就是语言级的 goroutine。

9. 官方习惯(不是语法强制,但大家当规则用)

  • 对外方法第一个参数常常是 ctx context.Context(本仓库硬性要求)。
  • 短接收者名:func (s *AuditTaskService),不用 this。
  • 错误先处理,成功逻辑往下写,少套一层 else。
  • 包名小写、不用下划线:bootstrap、audit_task 是文件名,包名仍是 service / biz。
  • 格式化用 gofmt / goimports,空格缩进、大括号风格都是固定的。

想系统过一遍,官方 A Tour of Go 比一次性背完整语言规范有效。

相关推荐
To_OC13 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
2601_9628857213 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen14 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发14 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
前端兰博14 小时前
05-Redis
redis·后端
databook15 小时前
从手动检查到自动监控:一个数据质量工作流的实现
后端·python·数据分析
WL学习笔记15 小时前
日期类(C++)
开发语言·c++·日期类实现
【JAVA】玩家15 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
东风破_15 小时前
从 Neo4j 到 GraphRAG:用 Text-to-Cypher 构建图检索 RAG
人工智能·后端
谢亮_vipxieliang16 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法