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接口开发
相关推荐
云浪3 小时前
Go 堆实战:从完全二叉树到 Top-K 与任务调度
后端·go
猪猪拆迁队18 小时前
跨电脑复制共享-WebRTC 打洞踩坑
前端·后端·go
小小龙学IT19 小时前
Go 语言 gRPC(grpc-go)深度解析
rpc·架构·golang·go
newerp1 天前
pprof 火焰图(Flame Graph)阅读与热点代码重构实战
后端·程序员·go
云浪1 天前
Go源码分析:搞懂 Go 是如何实现堆的
后端·go·源码阅读
montEvergreen2 天前
RTMP 里的那根“连接线”:读一份 NetConnection 源码
后端·go
montEvergreen2 天前
RTMP 握手:一场客户端与服务端的“暗号”对决
后端·go
newerp2 天前
sync.Mutex 源码深度拆解:正常模式(自旋)与饥饿模式
后端·程序员·go
montEvergreen2 天前
RTMP 王国的“信笺百科全书”
后端·go