Go 基础语法
导入原则
导入的包或定义的变量若未使用会编译报错——强制减少无用开销。
类型转换
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 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 func() { if err := recover(); err != nil { fmt.Println("捕获异常:", err) } }()
|
Go 中空值写作 nil,而非 null。
遍历
1 2 3 4
| for k, v := range 数组名 { }
|
GORM 入门
依赖管理
1 2 3
| go get go mod tidy go mod vendor
|
DSN 数据库连接
&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 }
|