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