Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

简介

Go语言是一个既快速又性能卓越的开源编程语言。Gorm、Kitex和Hertz是三个基于Go语言的框架,都在不同的领域内有着广泛的应用。下面我们将从基本用法和常见API的讲解来介绍这三个框架。

Gorm

Gorm是一个简单而强大的ORM框架,可以处理从MySQL到PostgreSQL的关系数据库操作。以下是Gorm的基本用法。

安装

使用Gorm的第一步是安装它。可以使用以下命令安装最新版本的Gorm。

go get -u gorm.io/gorm

连接数据库

下面是一个示例,演示如何使用Gorm连接MySQL数据库。

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    db, err := gorm.Open(mysql.Open("user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
    if err != nil {
        panic(err)
    }
    defer db.Close()
}

定义模型

接下来,我们为Gorm定义一个模型。一个模型在Gorm中表示一个数据库表。

type User struct {
    gorm.Model
    Name         string
    Email        string
    Age          uint8
    Birthday     time.Time
    MemberNumber sql.NullString
    ActivatedAt  sql.NullTime
    CreatedAt    time.Time
    UpdatedAt    time.Time
}

CRUD操作

下面是一些Gorm的CRUD操作的基本用法:

创建一条记录

db.Create(&User{Name: "张三", Email: "zhangsan@xxx.com"})

更新一条记录

db.Model(&User{}).Where("name = ?", "张三").Update("name", "李四")

删除一条记录

db.Where("name = ?", "李四").Delete(&User{})

查询一条记录

var user User
db.First(&user, "name = ?", "张三")

查询多条记录

var users []User
db.Where("name like ?", "%三%").Find(&users)

Kitex

Kitex是一种高性能、易于使用的微服务框架,具有协程管理、协议照抄、泛化调用、任务显式/隐藏等特性。以下是Kitex的基本用法。

安装

Kitex可以使用以下命令来安装:

go get -u github.com/cloudwego/kitex

客户端

定义接口

首先,我们需要定义一个Kitex接口,例如:

type Greeter interface {
    Hello(context.Context, *HelloRequest) (*HelloReply, error)
}

type HelloRequest struct {
    Name string
}

type HelloReply struct {
    Message string
}

实现服务

然后,我们需要实现Kitex服务,例如:

type GreeterHandler struct {}

func (h *GreeterHandler) Hello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
    return &HelloReply{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil
}

创建服务器

最后,我们需要创建一个Kitex服务器,例如:

import (
    "context"
    "github.com/cloudwego/kitex/pkg/klog"
    "github.com/cloudwego/kitex/pkg/rpcinfo"
    "github.com/cloudwego/kitex/server"
    "github.com/cloudwego/kitex/server/http"
)

func main() {
    cfg := server.SvrConfig{
        Proto:      kitex_proto.ProtoSerilizerType(kitex_proto.SerializeType(1)),
        ListenOn:   "0.0.0.0:8080",
        ServerType: "http",
    }
    svr := http.NewServer(&cfg)
    kitex.RegisterGreetorServer(svr, &GreeterHandler{})
    if err := svr.Run(); err != nil {
        klog.Errorf("run server failed, err:%+v.", err)
    }  
}

客户端

创建客户端

在Kitex中,创建客户端非常简单。只需实例化一个客户端实现。

import (
    "context"
    "github.com/cloudwego/kitex/client"
    "github.com/cloudwego/kitex/pkg/klog"
)

func main() {
    cfg := client.NewClientConfig(client.WithRemote("localhost:8080"), client.WithClientThreshold(500))
    client := client.NewClient(cfg)
    if err := client.Init(); err != nil {
        klog.Errorf("init client failed, err=%+v.", err)
        return
    }
    defer client.Close()
}

调用服务

使用Kitex客户端调用服务也很简单。只需要使用生成的客户端接口调用函数。

func CallGreeterService(ctx context.Context, name string) (string, error) {
    req := &HelloRequest{Name: name}
    reply := &HelloReply{}
    greeterClient := kitex.NewGreeterClient(client)
    if err := greeterClient.Hello(ctx, req, reply); err != nil {
        return "", err
    }   
    return reply.Message, nil
}

Hertz

Hertz是一个轻量级的WEB框架,提供了快速构建中小型项目的能力。以下是Hertz的基本用法。

安装

可以使用以下命令安装最新版本的Hertz。

go get -u github.com/cosiner/hertz

创建路由

在Hertz中,我们可以使用Router函数创建路由。

func main() {
    router := hertz.Router()
    router.GET("/", func(ctx *hertz.Context) {
        ctx.String("Hello World!")
    })
    router.Run(":8080")
}

获取参数

从URL中获取参数在Hertz中非常简单。

func main() {
    router := hertz.Router()
    router.GET("/users/:name", func(ctx *hertz.Context) string {
        return "Hello, " + ctx.Param("name")
    })
    router.Run(":8080")
}

使用中间件

Hertz中的中间件可用于添加对请求和响应的处理。

func main() {
    router := hertz.Router()
    router.Use(func(ctx *hertz.Context) {
        fmt.Println("开始处理请求")
        ctx.Next()
        fmt.Println("请求处理结束")
    })
    router.GET("/", func(ctx *hertz.Context) {
        ctx.String("Hello World!")
    })
    router.Run(":8080")
}

示例说明

示例一:德州扑克牌库存管理

某个德州扑克牌小卖家需要一个库存管理平台,平台应该支持对库存的添加、销售和查询,以及低库存提醒。针对这个场景,我们可以使用Gorm和Hertz框架来实现此功能。

首先,我们需要定义一个牌类表的Gorm模型,用于存储牌类信息。

type Card struct {
    gorm.Model
    Name         string
    Count        uint8
    Price        float32
}

然后,我们需要创建一个Hertz应用程序,并使用Hertz的路由和Gorm的模型添加,查询和销售牌。

func main() {
    router := hertz.Router()
    router.POST("/cards", func(ctx *hertz.Context) {
        var card Card
        if err := ctx.Bind(&card); err != nil {
            ctx.String(http.StatusBadRequest, "绑定失败!")
            return
        }
        if err := db.Create(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "创建失败!")
            return
        }
        ctx.String(http.StatusCreated, "创建成功!")
    })
    router.GET("/cards", func(ctx *hertz.Context) {
        var cards []Card
        if err := db.Find(&cards).Error; err != nil {
            ctx.String(http.StatusBadRequest, "查询失败!")
            return
        }
        ctx.JSON(http.StatusOK, cards)
    })
    router.POST("/sale", func(ctx *hertz.Context) {
        var saleRequest SaleRequest
        if err := ctx.Bind(&saleRequest); err != nil {
            ctx.String(http.StatusBadRequest, "绑定失败!")
            return
        }
        var card Card
        if err := db.Where("name = ?", saleRequest.Card).First(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "找不到牌!")
            return
        }
        if card.Count < saleRequest.Count {
            ctx.String(http.StatusBadRequest, "库存不足!")
            return
        }
        card.Count -= saleRequest.Count
        if err := db.Save(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "销售失败!")
            return
        }
        ctx.String(http.StatusOK, "销售成功!")
    })
    router.Run(":8080")
}

最后,我们可以使用Gorm的Hooks机制来实现一个低库存提醒的功能,例如:

func checkLowStock(db *gorm.DB) {
    var cards []Card
    if err := db.Where("count <= ?", 10).Find(&cards).Error; err != nil {
        return
    }
    for _, card := range cards {
        fmt.Println(card.Name + "的库存不足!")
    }
}

func main() {
    db.Callback().Create().After("gorm:create").Register("hertz:checkLowStock", checkLowStock)
    router.Run(":8080")
}

示例二:牌类添加和销售系统

某个扑克牌销售商需要一个库存管理系统,可以添加、销售和查询扑克牌的库存。同时,需要使用Kitex的客户端和服务器来实现多个用户之间的实时库存交流。针对这个场景,我们可以使用Gorm和Kitex框架来实现此功能。

在这个场景中,和前面一样,我们需要首先定义一个牌类表的Gorm模型,用于存储牌类信息。

type Card struct {
    gorm.Model
    Name         string
    Count        uint8
    Price        float32
}

然后,我们需要创建一个Kitex服务来实现库存交流。

type GreeterHandler struct {}

type StockRequest struct {
    Name string
}

type StockReply struct {
    Count uint8
}

func (h *GreeterHandler) Stock(ctx context.Context, req *StockRequest) (*StockReply, error) {
    var card Card
    if err := db.Where("name = ?", req.Name).First(&card).Error; err != nil {
        return nil, err
    }
    return &StockReply{Count: card.Count}, nil
}

func main() {
    cfg := server.SvrConfig{
        ServerType: "http",
        ListenOn:   "0.0.0.0:8081",
    }
    svr := http.NewServer(&cfg)
    kitex.RegisterStockServer(svr, &GreeterHandler{})
    if err := svr.Run(); err != nil {
        klog.Errorf("run stock server failed, err:%+v.", err)
    }
}

最后,我们可以在Hertz应用程序中使用作为客户端的生成的Kitex接口来添加和销售牌。

ctx := context.Background()
stockClient := kitex.NewStockClient(client)
var card Card
if err := db.Where("name = ?", request.Name).First(&card).Error; err != nil {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "找不到牌类"})
    return
}
if card.Count < request.Count {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "库存不足"})
    return
}
card.Count -= request.Count
if err := db.Save(&card).Error; err != nil {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "销售失败"})
    return
}
if _, err := stockClient.Stock(context.Background(), &kitex.StockRequest{Name: card.Name}); err != nil {
    fmt.Printf("获取库存失败:%v.\n", err)
}
ctx.String(http.StatusOK, "销售成功!")

结论

这篇文章简要介绍了Gorm、Kitex和Hertz这三个基于Go语言的框架的常用API和基本用法。这些框架都非常适合中小型项目,能够以高效的方式提供卓越的性能和开发体验。如果你是一名Golang开发人员,我们强烈建议你熟悉和尝试这些框架。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 详解Git建立本地仓库的两种方法

    下面是详解Git建立本地仓库的两种方法的完整攻略。 方法一:从本地文件夹创建新的Git仓库 步骤一:创建目录并初始化Git仓库 首先,我们需要创建一个新的目录来存储我们的项目文件。可以在命令行中输入以下命令: mkdir myproject cd myproject git init 这会在当前目录下创建一个名为“myproject”的文件夹,并初始化一个名…

    GitHub 2023年5月16日
    00
  • django-allauth入门学习和使用详解

    Django-allauth入门学习和使用详解 Django-allauth是一个在Django框架下使用的第三方认证和授权库,支持多种OAuth协议和OpenID协议。在本教程中,我们将介绍Django-allauth的基本设置和使用方法。 安装Django-allauth 打开终端,进入Django项目所在的虚拟环境。 在终端中输入以下命令安装Djang…

    GitHub 2023年5月16日
    00
  • Golang中Gin框架的使用入门教程

    下面详细讲解“Golang中Gin框架的使用入门教程”的完整攻略。 一、Gin框架介绍 Gin是一个高性能的Go语言Web框架, 旨在提供简洁的API操作和高效的路由处理。 Gin的API易于使用,Goroutine友好,并提供了一种方便的设计模式来处理各种Web路由,并将HTTP请求传递给正确的处理程序。 二、Gin框架的安装 要开始使用Gin框架,您需要…

    GitHub 2023年5月16日
    00
  • 开源鸿蒙 OpenHarmony Github 镜像库正式上线

    关于“开源鸿蒙 OpenHarmony Github 镜像库正式上线”的攻略,下面是详细的内容介绍。 如何使用OpenHarmony Github镜像库? OpenHarmony Github镜像库是指按照进口开源软件的要求,将Github上的OpenHarmony代码及附件复制到境内的开源镜像库上,这样能够更快捷地下载OpenHarmony开源项目。下面介…

    GitHub 2023年5月16日
    00
  • Git安装和使用图文教程(分享)

    下面是详细的“Git安装和使用图文教程(分享)”攻略和示例说明。 Git安装和使用图文教程(分享) 1. 安装Git Git是一款非常流行的分布式版本控制系统,它能够帮助我们更好地管理和协作项目。以下是在Windows系统上安装Git的步骤。 1.1 下载Git安装程序 首先,我们需要下载Git的安装程序。可以从Git官网下载相应的版本,也可以从GitHub…

    GitHub 2023年5月16日
    00
  • go Cobra命令行工具入门教程

    《Go Cobra命令行工具入门教程》是一篇详细介绍如何使用Go语言编写命令行应用程序的教程,其中使用了Cobra作为命令行框架。本文将对该教程进行详细介绍。 简介 Cobra是一个用于构建命令行应用程序的Go语言库,提供了一个优雅的开发界面、简单的命令行接口、帮助指南和子命令。使用Cobra可以快速构建出一个功能强大的命令行应用程序。 安装Cobra 首先…

    GitHub 2023年5月16日
    00
  • Git建立本地仓库并上传到Gitee的详细步骤

    下面是Git建立本地仓库并上传到Gitee的详细步骤: 1. 创建Gitee仓库并获取SSH地址 首先登录到Gitee,进入个人中心,在左侧菜单栏中选择“我的仓库”,并点击“创建仓库”按钮,输入仓库名称、描述、选择仓库类型、是否私有等信息,然后点击“创建仓库”按钮,就可以创建一个Gitee仓库了。 创建成功后,在该仓库的页面中找到SSH地址,并记下来,后面需…

    GitHub 2023年5月16日
    00
  • Git的代码合入流程详解

    Git的代码合入流程详解 Git的代码合入流程一般包括以下步骤: 创建并切换到新的分支 在新分支上进行代码修改和提交 在本地合并主分支到新分支 解决代码冲突并提交合并结果 推送新分支到远程仓库 创建并提交合并请求 合并被请求的分支到主分支 下面以两个示例说明Git的代码合入流程。 示例一 假设你要为一个开源项目做出贡献,你需要将你的代码提交到该项目的主分支上…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部