Go = Golang,谷歌出的编译型静态语言,主打简单、高性能、并发友好、工程化,后端/云原生最常用。
1. 最核心特点一句话
- 静态强类型:变量类型固定,写代码就要确定类型,编译就检查类型错误(不像Python运行才报错)
- 编译型:直接编译成机器二进制,不依赖虚拟机,单文件就能部署
- 极简语法 :关键字很少,没有继承、没有class,用结构体struct描述数据
- 原生并发:goroutine + channel,轻量级协程,是Go最大亮点
- 自带GC垃圾回收:不用手动malloc/free,但会有GC停顿
- 模块管理:go mod,管理第三方包(如GORM)
2. 基础概念,结合你刚才的 SysConfig 代码
① package 包
package models
Go代码必须属于一个包。
package main:可执行程序(会编译出二进制,有func main()入口)- 其他包(models、service、dao):库包 ,只提供结构体/函数,不能直接运行,供别的代码导入使用。 你的 models 包:专门放数据库模型结构体。
② import 导入包
import "time"
引入内置/第三方包,类似 import / include。
- 标准库:
time、fmt、net/http - 第三方:
gorm.io/gorm需要go get下载
③ struct 结构体(重点!你代码核心)
Go 没有 class 类 ,用 struct 来定义一组字段,用来描述数据(数据库实体、请求参数都用它)
type SysConfig struct {
ID uint64
ConfigKey string
}
type:定义新类型- 字段名大写开头:导出(public) ,外部包可以访问;小写=私有,外部访问不了 👉 你的 SysConfig 所有字段首字母大写,因为 GORM、JSON序列化需要读取字段,必须大写!
④ Tag 结构体标签 gorm:"xxx" json:"xxx"
就是附在字段后面的元信息字符串,不是Go原生语法,是第三方库(GORM、json包)读取解析
ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"`
gorm:"...":GORM库读这个标签,映射MySQL表字段、主键、索引json:"id":标准库encoding/json序列化时,JSON里key叫id,而不是ID
⑤ 方法 Method(给结构体绑定函数)
func (SysConfig) TableName() string { return "t_sys_config" }
(SysConfig):接收者(receiver),给SysConfig绑定一个方法- 没有
*:值接收者,操作的是结构体副本; - 写
(s *SysConfig):指针接收者,操作原对象(修改内容必须用指针) GORM 约定:只要结构体实现TableName(),就能自定义数据库表名。
3. 基础类型(对照你的模型)
uint64 // 无符号64位整数 → mysql bigint unsigned
string // 字符串,不可变
time.Time // 时间类型,不是普通字符串,GORM自动映射datetime
bool // 布尔
int,int64,float64 // 数字
4. 函数写法
func 函数名(参数 类型) 返回值类型 {
return ...
}
可以返回多个返回值 ,Go的经典写法(例如 row, err := db.Find(...))
func Add(a int,b int) int {
return a+b
}
5. 并发极简理解(Go招牌)
go func(){
// 开启一个goroutine轻协程跑这里
}()
go关键字,一行拉起协程,比线程轻量几十万级别。 配合channel做协程通信,不推荐共享内存加锁。
6. 错误处理(和其他语言很大区别)
Go没有try-catch异常 ,错误用返回值 error:
result, err := SomeFunc()
if err != nil {
// 处理错误
}
7. 项目目录常规风格(后端项目,和你models配套)
project/
├─ go.mod // 项目依赖管理文件
├─ main.go // package main,程序入口
├─ models/
│ └─ sys_config.go // 就是你这段代码,数据库模型
├─ dao/ // 数据库操作(GORM增删改查)
├─ service/ // 业务逻辑
└─ controller // http接口,接收前端请求
8. 快速区分几个容易混淆点
- 大写 = 对外可见;小写 = 仅当前包内可用(高频踩坑!GORM查不出数据大概率字段小写)
- struct是数据载体,没有继承;用组合替代继承
- 结构体标签只是字符串注释,Go本身不处理,只有第三方库解析
uint64无符号,不能存负数;int64有符号
9. 跑起一个最小demo(复制直接运行,感受Go)
package main
import "fmt"
type User struct {
ID uint64 `json:"id"`
Name string `json:"name"`
}
func (u User) Hello() string {
return "Hello " + u.Name
}
func main() {
u := User{ID: 1, Name: "test"}
fmt.Println(u.Hello())
}
运行:
go run main.go
下一步可选方向
- 先练:变量、struct、指针、error处理
- 再学:GORM CRUD(刚好你有SysConfig模型)
- 进阶:goroutine、http接口开发