Golang gorm包 Golang

package main

// gorm 官方文档
// https://gorm.io/zh_CN/docs/

// 安装gorm
// go get -u gorm.io/gorm
// go get -u gorm.io/driver/mysql

// 如果因网络问题无法安装,尝试更换网络源
// 设置清华大学源
// go env -w GOPROXY=https://goproxy.cn,direct

// 初始化数据库连接
// import (
//  "gorm.io/driver/mysql"
//  "gorm.io/gorm"
//  "log"
// )

// func main() {
//  dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
//  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
//  if err != nil {
//      log.Fatalf("failed to connect database: %v", err)
//  }

//  log.Println("Database connected successfully!")
// }
// dsn:数据源名称,需要替换 user、password 和 dbname。
// gorm.Config{}:GORM 的配置选项。

// 定义模型
// 定义与数据库表对应的模型
// type User struct {
//  ID        uint   `gorm:"primaryKey"`
//  Name      string `gorm:"size:100"`
//  Email     string `gorm:"uniqueIndex;size:100"`
//  CreatedAt time.Time
//  UpdatedAt time.Time
//  DeletedAt gorm.DeletedAt `gorm:"index"`
// }

// 迁移表结构
// 使用 GORM 的自动迁移功能创建表
// err = db.AutoMigrate(&User{})
// if err != nil {
//  log.Fatalf("failed to migrate database: %v", err)
// }
// log.Println("Database migrated successfully!")

// 基本操作
// 1.创建数据
// user := User{Name: "John Doe", Email: "john.doe@example.com"}
// result := db.Create(&user)

// if result.Error != nil {
//  log.Fatalf("failed to create user: %v", result.Error)
// }

// log.Printf("User created successfully: %+v", user)

// 2.查询记录
// var user User
// db.First(&user, 1) // 根据主键查询
// db.First(&user, "email = ?", "john.doe@example.com") // 条件查询

// log.Printf("User found: %+v", user)

// 3.更新记录
// db.Model(&user).Update("Name", "Jane Doe")
// db.Model(&user).Updates(User{Name: "Jane Doe", Email: "jane.doe@example.com"}) // 批量更新

// 4.删除记录
// db.Delete(&user) // 根据主键删除

// 高级功能
// 1.查询多条数据
// var users []User
// db.Where("name LIKE ?", "%Doe%").Find(&users)
// log.Printf("Users found: %+v", users)

// 2.分页和排序
// var users []User
// db.Order("created_at desc").Limit(10).Offset(0).Find(&users) // 分页

// 3.事务支持
// err = db.Transaction(func(tx *gorm.DB) error {
//  if err := tx.Create(&User{Name: "User1"}).Error; err != nil {
//      return err
//  }
//  if err := tx.Create(&User{Name: "User2"}).Error; err != nil {
//      return err
//  }
//  return nil
// })
// if err != nil {
//  log.Fatalf("Transaction failed: %v", err)
// }

// 常用配置
// 在初始化时配置 GORM 的行为
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//  Logger: logger.Default.LogMode(logger.Info), // 显示详细的 SQL 日志
// })

// 字段级权限控制
// type User struct {
//  Name string `gorm:"<-:create"` // 允许读和创建
//  Name string `gorm:"<-:update"` // 允许读和更新
//  Name string `gorm:"<-"`        // 允许读和写(创建和更新)
//  Name string `gorm:"<-:false"`  // 允许读,禁止写
//  Name string `gorm:"->"`        // 只读(除非有自定义配置,否则禁止写)
//  Name string `gorm:"->;<-:create"` // 允许读和写
//  Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)
//  Name string `gorm:"-"`  // 通过 struct 读写会忽略该字段
//  Name string `gorm:"-:all"`        // 通过 struct 读写、迁移会忽略该字段
//  Name string `gorm:"-:migration"`  // 通过 struct 迁移会忽略该字段
//   }

// 创建/更新时间追踪(纳秒、毫秒、秒、Time)
// GORM 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果您定义了这种字段,GORM 在创建、更新时会自动填充 当前时间
// 要使用不同名称的字段,您可以配置 autoCreateTime、autoUpdateTime 标签。
// 如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将 time.Time 修改为 int 即可
// type User struct {
//  CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充
//  UpdatedAt int       // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
//  Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳纳秒数填充更新时间
//  Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
//  Created   int64 `gorm:"autoCreateTime"`      // 使用时间戳秒数填充创建时间
//   }

//字段标签
// column   指定 db 列名
// type 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
// serializer   指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime
// size 定义列数据类型的大小或长度,例如 size: 256
// primaryKey   将列定义为主键
// unique   将列定义为唯一键
// default  定义列的默认值
// precision    指定列的精度
// scale    指定列大小
// not null 指定列为 NOT NULL
// autoIncrement    指定列为自动增长
// autoIncrementIncrement   自动步长,控制连续记录之间的间隔
// embedded 嵌套字段
// embeddedPrefix   嵌入字段的列名前缀
// autoCreateTime   创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
// autoUpdateTime   创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
// index    根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
// uniqueIndex  与 index 相同,但创建的是唯一索引
// check    创建检查约束,例如 check:age > 13,查看 约束 获取详情
// <-   设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
// ->   设置字段读的权限,->:false 无读权限
// -    忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限
// comment  迁移时为字段添加注释

// 配置表前缀
// dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//  NamingStrategy: schema.NamingStrategy{
//      TablePrefix:   "prefix_", // 设置表前缀
//      SingularTable: true,      // 禁用表名复数
//  },
//  Logger: logger.Default.LogMode(logger.Info),
// })
// TablePrefix:设置表前缀,例如 prefix_。
// SingularTable:
// 默认情况下,GORM 会将模型名转换为复数形式(如 User -> users)。
// 设置为 true 后,表名将保持单数形式。

// 自定义表名
// 对某个模型单独设置表名,可以实现 TableName 方法
// type User struct {
//     ID   uint
//     Name string
// }

// func (User) TableName() string {
//     return "custom_user_table"
// }

// 其他常见配置
// sqlDB, _ := db.DB()
// sqlDB.SetMaxIdleConns(10) // 设置空闲连接数
// sqlDB.SetMaxOpenConns(100) // 设置最大连接数
// sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接的最大生命周期

// 配置日志输出
// 可以定制 GORM 的日志行为,例如输出到文件

// file, _ := os.Create("gorm.log")
// newLogger := logger.New(
//     log.New(file, "\r\n", log.LstdFlags),
//     logger.Config{
//         SlowThreshold: time.Second,   // 慢查询阈值
//         LogLevel:      logger.Warn,   // 日志级别
//         IgnoreRecordNotFoundError: true,
//     },
// )

// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//     Logger: newLogger,
// })

// 完整配置总结
    // dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    // db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    //  SkipDefaultTransaction: true, // 跳过默认事务
    //  NamingStrategy: schema.NamingStrategy{
    //      TablePrefix:   "prefix_", // 设置表前缀
    //      SingularTable: true,      // 禁用表名复数
    //  },
    //  Logger: logger.Default.LogMode(logger.Info), // 显示详细日志
    // })

    // if err != nil {
    //  log.Fatalf("failed to connect database: %v", err)
    // }

    // // 配置连接池
    // sqlDB, _ := db.DB()
    // sqlDB.SetMaxIdleConns(10)
    // sqlDB.SetMaxOpenConns(100)
    // sqlDB.SetConnMaxLifetime(time.Hour)

    // log.Println("Database connected successfully!")

func main(){

}

杨佳乐 发布于  2025-1-17 10:49 

Golang mod 包管理 Golang

package main

// Go Modules 是 Go 的官方包管理工具,用于管理项目依赖和版本

// 检查当前模块状态
// go env GO111MODULE 
// 如果输出是 auto 或 on,则已启用

// 初始化项目
// go mod init <module-name>

// 添加依赖
// 当你在代码中导入外部包时,运行以下命令自动下载依赖并更新 go.mod 和 go.sum
// go mod tidy

// 例如,在代码中添加以下依赖:

import "github.com/gin-gonic/gin"

// 然后运行
// go mod tidy

// 更新依赖
// 运行以下命令查看项目的所有依赖及其版本
// go list -m all

// 更新依赖到最新版本
// go get -u <package>

// 更新到特定版本
// go get <package>@<version>

// 例如
// go get github.com/gin-gonic/gin@v1.8.1

// 移除无用依赖
// go mod tidy
//此命令会移除未使用的依赖,并更新 go.mod 和 go.sum

// 下载依赖
// 只下载项目的所有依赖而不运行代码
// go mod download

// 验证依赖
// 验证项目的所有依赖是否正确(哈希值与 go.sum 一致)
// go mod verify

// 常用命令汇总
// go mod init <module> 初始化 Go Modules 项目
// go mod tidy  清理未使用的依赖,添加缺失的依赖
// go mod download  下载依赖到本地
// go mod verify    验证依赖是否正确
// go list -m all   查看所有依赖
// go get <package>@<version>   安装或更新特定版本的依赖
// go mod graph 查看依赖图

// go.mod 文件结构

// module: 项目名称。
// go: 使用的 Go 版本。
// require: 项目的依赖及其版本。
// replace: 替换依赖版本或路径。

杨佳乐 发布于  2025-1-16 10:24 

Golang 常用web框架推荐 Golang

Go 常见 Web 框架详解

Go 语言中有许多优秀的 Web 框架可供选择。以下是一些常见的 Web 框架的特点和适用场景。


Gin

简介

Gin 是一个轻量级、高性能的 Web 框架,设计简单但功能强大。它基于 net/http,但提供了更高的开发效率。

特点

  • 快速,路由性能优秀。
  • 支持中间件。
  • 提供简洁的 JSON 处理。
  • 丰富的社区支持和插件。

适用场景

适合快速开发 RESTful API 和中小型项目。


Echo

简介

Echo 是另一个轻量级、高性能的 Web 框架,与 Gin 类似,但提供了更多的功能和灵活性。

特点

  • 极简的 API。
  • 支持中间件和分组路由。
  • 支持模板渲染。
  • 内置数据验证和绑定功能。

适用场景

适合快速开发、需要灵活性的项目。


Fiber

简介

Fiber 是一个基于 fasthttp 的 Web 框架,设计灵感来源于 Node.js 的 Express 框架。

特点

  • 高性能,专为速度优化。
  • 易于上手,API 设计类似 Express。
  • 内置丰富的功能(如中间件、模板引擎等)。

适用场景

适合需要极致性能和熟悉 Express 的开发者。


Beego

简介

Beego 是一个全功能的 Web 框架,提供了 MVC 架构,适合构建大型 Web 应用。

特点

  • 内置 ORM、缓存、日志、任务调度等功能。
  • 支持 RESTful 风格的路由。
  • 提供自动化的 API 文档生成。

适用场景

适合构建企业级 Web 应用或需要一站式解决方案的项目。


Revel

简介

Revel 是一个全栈 Web 框架,提供了许多开箱即用的功能,适合快速开发完整的 Web 应用。

特点

  • 完整的 MVC 模式。
  • 提供代码热重载功能。
  • 支持表单验证和国际化。

适用场景

适合传统 MVC 风格的开发。


Chi

简介

Chi 是一个小巧但功能强大的路由器库,支持构建中间件链。

特点

  • 轻量级,零依赖。
  • 高度可扩展。
  • 支持上下文传递。

适用场景

适合需要简单但灵活的路由功能的项目。


对比总结

框架 性能 学习曲线 功能丰富性 社区支持 适用场景
Gin 高 低 中等 强 中小型项目,RESTful API
Echo 高 中 丰富 强 灵活性需求高的项目
Fiber 极高 低 丰富 强 性能敏感型项目
Beego 中 中 丰富(全栈) 强 企业级项目
Revel 中 高 丰富(全栈) 中 传统 MVC 项目
Chi 高 中 基础 中 轻量路由器需求

推荐选择

  1. 初学者:从 Gin 开始,了解基础概念和开发模式。
  2. 快速开发:Gin、Echo、Fiber 都是高效的选择。
  3. 全栈开发:选择 Beego 或 Revel。
  4. 高性能:Fiber 或 Chi。
  5. 企业项目:Beego 提供了全面的功能支持。

杨佳乐 发布于  2025-1-13 21:24 

Golang log标准库 Golang

package main

import (
    "log"
    "os"
)

// log 标准库是一个简单而强大的日志工具,用于记录程序运行过程中的信息。它支持日志输出到控制台、文件等,还可以自定义格式和行为

func main(){

    // 基本用法
    log.Println("This is a log message")
    log.Printf("This is a formatted log: %d", 42)
    // log.Fatal("这将记录消息并退出程序") //打印日志后调用 os.Exit(1) 退出程序
    // log.Panic("这将记录消息并报异常") //打印日志后调用 panic

    // 默认行为
    // 默认输出到标准错误(os.Stderr)
    // 默认日志格式:时间戳 + 日志内容
    // 默认包含日期和时间

    // 设置日志前缀
    // 使用 log.SetPrefix 添加前缀
    log.SetPrefix("[INFO] ")
    log.Println("This is an informational message")
    // [INFO] 2025/01/13 20:46:02 This is an informational message

    // 设置日志标志
    // 使用 log.SetFlags 控制日志的时间格式和内容
    log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
    log.Println("This is a detailed log message")
    // [INFO] 2025/01/13 20:47:17.910174 8-pkg-log.go:35: This is a detailed log message

    // 常用标志:
    // log.Ldate: 日期(2025/01/12)。
    // log.Ltime: 时间(12:34:56)。
    // log.Lmicroseconds: 微秒级时间戳。
    // log.Llongfile: 绝对路径和文件名。
    // log.Lshortfile: 短文件名和行号。
    // log.LUTC: 使用 UTC 时间。

    // 日志输出到文件
    file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("Failed to open log file: %s", err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.Println("This log will be written to the file")

    // 使用自定义 Writer
    // var buffer bytes.Buffer
    // log.SetOutput(&buffer)

    // log.Println("This log is written to a buffer")
    // log.Println("Another log message")

    // // 打印缓冲区内容
    // println(buffer.String())

    // 创建自定义日志器
    file2, _ := os.OpenFile("app2.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    defer file2.Close()

    logger := log.New(file2, "[CUSTOM] ", log.Ldate|log.Ltime|log.Lshortfile)
    logger.Println("This is a custom log message")

    // 记录错误
    // err := errors.New("an example error")
    // log.Printf("Error occurred: %v", err)

}

杨佳乐 发布于  2025-1-13 20:55 

Golang net/http标准库 Golang

简单开启一个http服务端,或者作为http客户端发起请求


杨佳乐 发布于  2025-1-12 20:32