Go 基础语法

导入原则

1
import "xxx"

导入的包或定义的变量若未使用会编译报错——强制减少无用开销。

类型转换

1
2
// 使用 strconv 包进行类型转换
// 函数通常返回两个值:结果值和 error

goto

跳转关键字,可在函数内跳转到指定标签。

函数

Go 中不支持函数重载——同一作用域下函数名必须唯一。

1
2
3
4
// 别名 ≠ 原类型,不能直接赋值,但可以显式转换后赋值
type MyInt int
var a MyInt = 10
var b int = int(a) // 需要显式转换

  • 方法能否被外部调用取决于首字母是否大写public / private 的体现)
  • 同一个包下不能有重名函数
  • Go 有”声明必使用”的原则,别名声明后就不能再用原名调用

init() 函数

源文件执行顺序:

1
import → 全局变量定义 → init() → main()

匿名函数

1
2
3
4
5
6
7
8
9
// 一次使用
func() { ... }()

// 多次使用
fn := func() { ... }
fn()

// 全局(可外部引用)
var Fn = func() { ... }

闭包

闭包引用了函数体之外的变量,函数+引用环境 = 闭包。

defer

  • defer 压栈时相当于值拷贝,不会随后面变化而变化
  • 通常用于资源关闭(文件、连接等),创建资源后紧随 defer 关闭
1
2
f, _ := os.Open("file.txt")
defer f.Close()

字符串

1
2
// Go 中一个汉字占 3 字节(UTF-8)
// 字符串遍历使用 strings 包

日期时间

1
2
3
4
5
6
7
8
9
import "time"

now := time.Now()
now.Year()
now.Month()
now.Day()

// 时间格式化(数字固定)
now.Format("2006-01-02 15:04:05")

注意:Go 的时间格式化模板数字 2006-01-02 15:04:05 是固定的,不能随意更改。

错误捕获

1
2
3
4
5
6
// defer + recover 替代 try/catch
defer func() {
if err := recover(); err != nil {
fmt.Println("捕获异常:", err)
}
}()

Go 中空值写作 nil,而非 null

遍历

1
2
3
4
// for range
for k, v := range 数组名 {
// k 为下标,v 为对应值
}

GORM 入门

依赖管理

1
2
3
go get          # 下载并安装包
go mod tidy # 整理依赖,移除未使用的包
go mod vendor # 生成本地 vendor 目录

DSN 数据库连接

1
// 用户名:密码@tcp(IP)/数据库名?charset=utf8mb4&parseTime=true&loc=Local

&parseTime=true 中的 & 会影响结构体是否同步更新。加 & 时,插入记录后 user.ID 能获取到自增主键值;不加则不会同步,需要手动查询。

常用方法

方法 说明
Create(&user) 创建记录
Save(&user) 保存或更新,支持事务回滚等校验
First(&user) 查询第一条记录(按主键升序)
Last(&user) 查询最后一条记录(按主键降序)
Find(&users) 查询多条记录
Where(...).Find(&users) 条件查询
Model(&User{}).Update(...) 更新字段

示例:

1
2
3
db.Where("name = ?", "Alice").Find(&users)
db.Where("id > ?", 20).Find(&users)
db.Model(&User{}).Update("name", "NewName")

模型示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package models

import (
"gorm.io/gorm"
"time"
)

type UserBasic struct {
gorm.Model
Username string
Password string
Phone string
Email string
Identity string
ClientIp string
ClientPort string
LoginTime time.Time
HeartbeatTime time.Time
LoginOutTime time.Time `gorm:"column:login_out_time" json:"login_out_time"`
IsLogout bool
DeviceInfo string
}

func (table *UserBasic) TableName() string {
return "user_basic"
}

func GetUserList() []*UserBasic {
data := make([]*UserBasic, 10)
utils.DB.Find(&data)
return data
}