Go 语言快速理解

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. 快速区分几个容易混淆点

  1. 大写 = 对外可见;小写 = 仅当前包内可用(高频踩坑!GORM查不出数据大概率字段小写)
  2. struct是数据载体,没有继承;用组合替代继承
  3. 结构体标签只是字符串注释,Go本身不处理,只有第三方库解析
  4. 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

下一步可选方向

  1. 先练:变量、struct、指针、error处理
  2. 再学:GORM CRUD(刚好你有SysConfig模型)
  3. 进阶:goroutine、http接口开发
相关推荐
KevinAshen6716 小时前
用 Go 修复旧下载工具:从接口 403 到凭证截断的完整复盘
go·github
FungLeo2 天前
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码
golang·go·jwt·身份认证·成为全栈·bcrypt
FungLeo2 天前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈
小满zs2 天前
Go语言第十七章(反射)
后端·go
小满zs2 天前
Go语言第十五章(JSON序列化)
后端·go
小满zs2 天前
Go语言第十六章(自定义类型)
后端·go
w-w0w-w2 天前
Go语言学习day1
go
FungLeo3 天前
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
vipxieliang3 天前
Go 1.25 Green Tea GC 深度解析:以页为单位的垃圾回收新范式
go
孔令飞3 天前
AI 时代岗位调研分析:调研了近3000份AI岗位描述,分享下调研结果
云原生·go·ai编程