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 

Golang time标准库 Golang

package main

import (
    "fmt"
    "time"
)

func main(){

    // time 是 Go 标准库中一个非常重要的包,用于处理时间相关的操作,如获取当前时间、格式化时间、计算时间间隔、创建定时器等

    // 核心类型
    // time.Time 表示一个时间点,是time包中最核心的类型

    //常用方法
    // time.Now():获取当前时间。
    // t.Year() / t.Month() / t.Day():获取年、月、日。
    // t.Hour() / t.Minute() / t.Second():获取时、分、秒。
    // t.Format(layout string):格式化时间。

    now := time.Now()

    fmt.Println("当前时间",now)

    // 获取具体的时间部分
    fmt.Printf("年:%d,月:%d,日:%d",now.Year(),now.Month(),now.Day())

    fmt.Printf("时:%d,分:%d,秒:%d",now.Hour(),now.Minute(),now.Second())

    fmt.Println("格式化时间:",now.Format("2006-01-02 15:04:05"))

    // time.Duration 表示两个时间点之间的时间间隔,单位是纳秒

    // 常用方法:
    // 表示间隔:time.Second, time.Minute, time.Hour 等。
    // 运算:可以用加减法计算时间间隔。
    // time.Sleep(duration):让程序暂停指定时间。

    duration := 2 * time.Second
    fmt.Println("等待时间:", duration)

    // 程序暂停
    time.Sleep(duration)
    fmt.Println("等待结束")

    // time.Ticker 和 time.Timer

    //time.Ticker
    //time.Ticker 是一个定时器,用于在固定的时间间隔重复执行操作。

    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()

    for i := 0; i < 3; i++ {
        <-ticker.C
        fmt.Println("执行一次:", time.Now())
    }

    //time.Timer
    //time.Timer 是一个单次触发的定时器

    timer := time.NewTimer(2 * time.Second)
    fmt.Println("计时开始:", time.Now())

    <-timer.C
    fmt.Println("计时结束:", time.Now())

    // 时间计算

    //时间间隔
    //可以通过 time.Sub 方法计算两个时间点之间的间隔

    start := time.Now()
    time.Sleep(2 * time.Second)
    end := time.Now()

    duration2 := end.Sub(start)
    fmt.Println("间隔时间:", duration2)

    //时间加减
    //通过 Add 或 AddDate 方法可以对时间进行加减

    newNow := time.Now();

    fmt.Println("当前时间:",newNow)

    // 加 6 小时
    later := newNow.Add(6 * time.Hour)
    fmt.Println("加 6 小时:", later)

    // 减 1 天
    earlier := newNow.AddDate(0, 0, -1)
    fmt.Println("减 1 天:", earlier)

    // 时间格式化与解析
    //时间格式化

    // 通过 time.Format 方法可以将时间转换为字符串。
    // 格式说明:
    // 年:2006
    // 月:01
    // 日:02
    // 时:15(24小时制) / 03(12小时制)
    // 分:04
    // 秒:05
    // AM/PM:PM

    // 常见格式
    fmt.Println("默认格式:", now.Format(time.RFC3339))
    fmt.Println("自定义格式:", now.Format("2006-01-02 15:04:05"))
    fmt.Println("12 小时制:", now.Format("2006-01-02 03:04:05 PM"))

    // 时间解析
    //通过 time.Parse 方法将字符串转换为时间对象
    layout := "2006-01-02 15:04:05"
    str := "2025-01-10 14:30:00"

    parsedTime, err := time.Parse(layout, str)
    if err != nil {
        fmt.Println("解析失败:", err)
        return
    }
    fmt.Println("解析时间:", parsedTime)

    // 其他常用方法

    //判断时间是否在某区间
    start = time.Now()
    time.Sleep(1 * time.Second)
    end = time.Now()

    fmt.Println("是否在区间内:", start.Before(end))

    //获取时间戳
    // 秒级时间戳
    fmt.Println("秒级时间戳:", now.Unix())

    // 纳秒级时间戳
    fmt.Println("纳秒级时间戳:", now.UnixNano())

    //常量
    // time 包定义了一些常用时间单位的常量:
    // time.Second:1 秒
    // time.Minute:1 分钟
    // time.Hour:1 小时
    // time.Microsecond:1 微秒
    // time.Millisecond:1 毫秒

    fmt.Println(time.Hour) // 1h0m0s

    // 总结
    // time 包是处理时间的强大工具。学习 time 包时,可以按以下步骤逐步深入:
    // 获取当前时间:time.Now()
    // 格式化与解析:time.Format 和 time.Parse
    // 时间计算:加减操作、间隔计算
    // 定时与延迟:time.Sleep, time.Ticker, time.Timer
    // 高级功能:如时区转换、时间戳等

}

杨佳乐 发布于  2025-1-10 22:05