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 

Golang Os标准库 Golang

package main

import (
    "fmt"
    "os"
)

func main(){

    // os 标准库提供了操作系统功能的接口,主要用于文件操作、环境变量管理、进程控制等

    // 文件操作

    //打开文件
    // os.Open(name string) (*os.File, error):只读方式打开文件。
    // os.OpenFile(name string, flag int, perm FileMode) (*os.File, error):指定模式打开文件

    file, err := os.Open("./1-基本语法.go")

    if err != nil {
        fmt.Println("打开文件失败",err)
        return
    }

    defer file.Close() // 关闭文件

    fmt.Println("打开文件成功",file.Name())

    //创建文件
    //os.Create(name string) (*os.File, error):创建文件(如果已存在,会清空)

    file2, err := os.Create("test.txt")
    if err != nil{
        fmt.Println("创建文件失败",err)
        return
    }

    file2.Close()

    fmt.Println("创建文件成功")

    //删除文件
    //os.Remove(name string) error:删除文件或空目录

    err = os.Remove("test.txt")

    if err != nil{
        fmt.Println("删除文件失败")
        return
    }
    fmt.Println("删除文件成功")

    // 目录操作

    //创建目录
    // os.Mkdir(name string, perm FileMode) error:创建单级目录。
    // os.MkdirAll(path string, perm FileMode) error:递归创建多级目录。

    err = os.Mkdir("testdir", 0755)
    if err != nil {
        fmt.Println("目录创建失败:", err)
        return
    }

    fmt.Println("目录创建成功")

    //删除目录
    // os.Remove(name string) error:删除空目录。
    // os.RemoveAll(path string) error:递归删除目录及其内容。

    err = os.RemoveAll("testdir")
    if err != nil {
        fmt.Println("目录删除失败:", err)
        return
    }

    fmt.Println("目录删除成功")

    //读取目录内容
    //os.ReadDir(name string) ([]os.DirEntry, error):读取目录中的内容
    entries, err := os.ReadDir(".")
    if err != nil {
        fmt.Println("读取目录失败:", err)
        return
    }

    for _, entry := range entries {
        fmt.Println(entry.Name())
    }

    // 环境变量

    // 获取环境变量
    // os.Getenv(key string) string:获取环境变量的值。
    // os.LookupEnv(key string) (string, bool):安全获取环境变量,判断是否存在。

    value := os.Getenv("HOME")
    fmt.Println("HOME 环境变量:", value)

    // 设置环境变量
    // os.Setenv(key, value string) error:设置环境变量。
    // err := os.Setenv("MY_VAR", "123")
    // if err != nil {
    //  fmt.Println("设置环境变量失败:", err)
    //  return
    // }

    // fmt.Println("环境变量设置成功:", os.Getenv("MY_VAR"))

    // 删除环境变量
    // os.Unsetenv(key string) error:删除环境变量
    // err := os.Unsetenv("MY_VAR")
    // if err != nil {
    //  fmt.Println("删除环境变量失败:", err)
    //  return
    // }

    // fmt.Println("环境变量已删除")

    // 进程操作

    //获取当前进程信息
    // os.Getpid() int:获取当前进程 ID。
    // os.Getppid() int:获取父进程 ID。

    fmt.Println("当前进程 ID:", os.Getpid())
    fmt.Println("父进程 ID:", os.Getppid())

    //退出程序
    // fmt.Println("程序开始")
    // os.Exit(0)
    // fmt.Println("这行不会被执行")

    // 获取和设置文件信息
    // 获取文件信息
    //os.Stat(name string) (os.FileInfo, error):获取文件或目录信息

    // info, err := os.Stat("example.txt")
    // if err != nil {
    //  fmt.Println("获取文件信息失败:", err)
    //  return
    // }

    // fmt.Println("文件名:", info.Name())
    // fmt.Println("文件大小:", info.Size())
    // fmt.Println("是否为目录:", info.IsDir())

    // 修改文件权限
    // os.Chmod(name string, mode FileMode) error:修改文件权限。

    // 总结
    // os 包主要用于以下功能:

    // 文件和目录操作:创建、删除、读取、修改。
    // 环境变量管理:获取、设置、删除。
    // 进程管理:获取进程信息、退出程序。
    // 文件信息:获取文件元信息、修改权限。

}

杨佳乐 发布于  2025-1-10 20:58