ProtoBuf、Grpc、GORM、Go-redis 入门基础

一、ProtoBuf、Grpc

ProtoBuf定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

说白了,可以将ProtoBuf文件 当作支持语言的代码交换工具

Grpc定义:gRPC 是一个高性能、跨平台、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。

说白了Grpc就是服务、客户端的接口通信标准之一

ProtoBuf、Grpc 的示例

//指定protobuf版本信息,目前最新的版本就是proto3

syntax = "proto3"; //syntax关键词定义使用的是proto3语法版本

//定义消息体包名

package app.service.book;

// 单独为go定义包名

option go_package=".;book" ; // option关键字后面的 go_package 表示为go重新定义包名

//单独为php类文件配置命名空间

option php_namespace="./app/service/book";//php_namespace 表示生成php类文件配置命名空间

//单独为php元数据文件配置命名空间

option php_metadata_namespace="./app/service/book";//php_metadata_namespace 表示生成php元数据配置命名空间

//当然上面除了java和php外 还支持很多语言的特殊配置,有兴趣的可以百度查询

//生成消息体 -通常用作接口传参和返回值定义

message DataRequest { //message是关键字 DataRequest是消息名

//[数据类型] [数据名称] = [数据标识号] //标识号和数据名称不能重复

int32 dataId32 = 1; //定义一个 int32 类型的数据,名称是 dataId32 标识号为1

int64 dataId64 = 2; //定义一个 int64 类型的数据,名称是 dataId64 标识号为2

string dataName = 3;//下面的我就不一一说明,大致意思都是一样的

bool dataBool = 4;

double dataDouble = 5;

float dataFloat = 6;

DataType type = 7 // DataType 是下面定义的枚举类型

DataNew dataNew = 8;//DataNew 是下面定义的消息体

map<string,string> dataMap = 9;//定义map类型的数据 map<key类型,value类型>

repeated string dataNameList = 10;// repeated关键字 表示声明一个数组数据

repeated DataNew dataNewList = 11;//repeated也可以用于消息体、map等

}

//定义一个枚举消息类型 DataType

enum DataType

{

hello = 0; //在proto3版本中,首成员必须为0,成员不应有相同的值

word = 1;

}

//定义一个新消息体

message DataNew{

int32 dataChildId = 1;

string dataChildName = 2;

}

//除了定义消息外,proto还可以定义服务(rpc)

service dataService { //service关键字 用于定义一个服务

rpc 服务关键字\] \[方法名称\](方法传参) \[returns 关键字\] \[方法返回值

rpc GetDataInfo(DataRequest ) returns (DataNew);

}

上面记录了ProtoBuf文件的定义示例,至于通过protoc将.proto文件生成相应的代码,大家各自百度就行。

下面我简单的记录一下 php 在windows下的调用:

protoc.exe --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=E:\\grpc_php_plugin.exe ./book.proto

--php_out= //指定php文件生成的路径

--grpc_out= //如果需要通过php调用grpc 则需要指定生成php_grpc的文件路径

--plugin=protoc-gen-grpc= //指定生成grpc文件对应的插件,大家可以上百度查找

如果大家是windows版本,且不会打包grpc_php_plugin.exe文件的话,我给提供一个大佬打包好的地址:

GitHub - lifenglsf/grpc_for_windows: grpc windows protobuf

如果命令运行过程中报缺少VCRUNTIME140_1.dll,MSVCP140.dll 等文件的话,在电脑上装个visual Studio 软件选中 C++桌面开发模块即可。

二、Gorm

Gorm定义:GORM是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单,使用上主要就是把struct类型和数据库表记录进行映射

Gorm示例:

首先通过go命令 安装mysql和Gorm相关驱动包

//安装MySQL驱动

go get -u gorm.io/driver/mysql

//安装gorm包

go get -u gorm.io/gorm

安装完驱动后,则开始连接sql 和 进行 sql 语句执行

package main //定义包名

//引入相应包

import (

"gorm.io/driver/mysql" //引入mysql驱动包

"gorm.io/gorm" //引入gorm驱动包

"fmt" //引入fmt包

"time" //引入time包

"errors" //引入errors包

)

//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应

//在这里User类型可以代表mysql users表

type User struct {

ID int64 // 主键

//`gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username

Username string `gorm:"column:username"`

Password string `gorm:"column:password"` //注意设定gorm:"column:" 后 mysql映射的列就只和column指定的字符串有关,和前面的变量名无关。

//创建时间,时间戳

CreateTime int64 `gorm:"column:createtime"`

}

//设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么

func (u User) TableName() string {

return "users" //绑定MYSQL表名为users

}

func main() {

//配置MySQL连接参数

username := "root" //账号

password := "123456" //密码

host := "127.0.0.1" //数据库地址,可以是Ip或者域名

port := 3306 //数据库端口

Dbname := "test" //数据库名

//通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称)

//MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local

//类似{username}使用花括号包着的名字都是需要替换的参数

dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)

//连接MYSQL

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

//err 用来接收gorm连接失败信息,连接成功则为nil

if err != nil { panic("连接数据库失败, error=" + err.Error()) }

//定义一个用户,并初始化数据

u := User{

Username:"tizi365",

Password:"123456",

CreateTime:time.Now().Unix(),

}

//下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823')

if err := db.Create(&u).Error; err != nil {

fmt.Println("插入失败", err)

return

}

上面只列举了gorm针对于mysql的inster使用方法,如果想看其他的搜gorm的中文文档即可。

文档借鉴地址:golang基础教程 - 梯子教程网

三、Go-Redis

Redis示例

安装redis依赖包

go get -u github.com/go-redis/redis

安装完redis后,进行redis连接调用

复制代码
package main

import (
    "fmt"
    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
       Addr:     "127.0.0.1:6379", // redis地址
       Password: "",               // redis密码,没有则留空
       DB:       0,                // 默认数据库,默认是0
    })

    // 设置一个key,过期时间为0,意思就是永远不过期
    err := client.Set("key", "value", 0).Err()

    // 检测设置是否成功
    if err != nil {
       panic(err)
    }

    // 根据key查询缓存,通过Result函数返回两个值
    //  第一个代表key的值,第二个代表查询错误信息
    val, err := client.Get("key").Result()

    // 检测,查询是否出错
    if err != nil {
       panic(err)
    }
    fmt.Println("key", val)

    /**
       Set - 设置一个key的值
       Get - 查询key的值
       GetSet - 设置一个key的值,并返回这个key的旧值
       SetNX - 如果key不存在,则设置这个key的值
       MGet - 批量查询key的值
       MSet - 批量设置key的值
       Incr,IncrBy,IncrByFloat - 针对一个key的数值进行递增操作
       Decr,DecrBy - 针对一个key的数值进行递减操作
       Del - 删除key操作,可以批量删除
       Expire - 设置key的过期时间
       HSet - 根据key和field字段设置,field字段的值
       HGet - 根据key和field字段,查询field字段的值
       HGetAll - 根据key查询所有字段和值
       HIncrBy - 根据key和field字段,累加数值。
       HKeys - 根据key返回所有字段名
       HLen - 根据key,查询hash的字段数量
       HMGet - 根据key和多个字段名,批量查询多个hash字段值
       HMSet - 根据key和多个字段名和字段值,批量设置hash字段值
       HSetNX - 如果field字段不存在,则设置hash字段值
       HDel - 根据key和字段名,删除hash字段,支持批量删除hash字段
       HExists - 检测hash字段名是否存在。
       LPush - 从列表左边插入数据
       LPushX - 跟LPush的区别是,仅当列表存在的时候才插入数据
       RPop - 从列表的右边删除第一个数据,并返回删除的数据
       RPush - 从列表右边插入数据
       RPushX - 跟RPush的区别是,仅当列表存在的时候才插入数据
       LPop - 从列表左边删除第一个数据,并返回删除的数据
       LLen - 返回列表的大小
       LRange - 返回列表的一个范围内的数据,也可以返回全部数据
       LRem - 删除列表中的数据
       LIndex - 根据索引坐标,查询列表中的数据
       LInsert - 在指定位置插入数据
       SAdd - 添加集合元素
       SCard - 获取集合元素个数
       SIsMember - 判断元素是否在集合中
       SMembers - 获取集合中所有的元素
       SRem - 删除集合元素
       SPop,SPopN - 随机返回集合中的元素,并且删除返回的元素
       ZAdd - 添加一个或者多个元素到集合,如果元素已经存在则更新分数
       ZCard - 返回集合元素个数
       ZCount - 统计某个分数范围内的元素个数
       ZIncrBy - 增加元素的分数
       ZRange,ZRevRange - 返回集合中某个索引范围的元素,根据分数从小到大排序
       ZRangeByScore,ZRevRangeByScore - 根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。
       ZRem - 删除集合元素
       ZRemRangeByRank - 根据索引范围删除元素
       ZRemRangeByScore - 根据分数范围删除元素
       ZScore - 查询元素对应的分数
       ZRank, ZRevRank - 查询元素的排名
    */
}
相关推荐
雮尘1 天前
手把手带你玩转Android gRPC:一篇搞定原理、配置与客户端开发
android·前端·grpc
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode